Open In App
Related Articles

How to convert C style strings to std::string and vice versa?

Improve Article
Improve
Save Article
Save
Like Article
Like

What are C style strings?
These strings are array of characters terminating with a NULL character. C style strings can be declared in following ways:

Declaration and initialization




/* To demonstrate C style strings */
#include<iostream>
using namespace std;
int main()
{
    /* Null character has to be added explicitly */
    char str1[8] = {'H' , 'E' , 'L' , 'L' , 'O' ,
                     '-','1','\0' };
      
    /* Compiler implicitly adds Null character */
    char str2[] = "HELLO-2" ;  
   
    /* Compiler implicitly adds Null character. 
       Note that string literals are typically stored
       as read only */
    const char *str3 = "HELLO-3" ;
  
    cout << str1 << endl << str2 << endl << str3;
    return 0;

Output:

HELLO-1
HELLO-2
HELLO-3

C style strings are operated with very useful functions like strcpy(), strlen(), strpbrk(), strcat(), strstr() and many more!(All these functions are member functions of ‘cstring‘ header ).

What is a std::string?
C++ standard library contains functions and classes. String is one of its classes. Here we deal with an object of string class. This std::string takes care of itself and manages its own memory.

Declaration and initialization




/* To demonstrate std::string */
#include<iostream>
#include<string>           
  
using namespace std;
int main()
{
    /* s becomes object of class string. */
    string s;  
  
    /* Initializing with a value. */           
    s = "HELLO";
  
    /* Printing the value */          
    cout << s; 
               
    return 0;
}

Output:

HELLO

Converting C-String to a std::string.
But why do we need this transformation? From a C string to a std::string? It is because

  • Std::string manages its own space. So programmer don’t need to worry about memory , unlike C strings (Since they are array of characters)
  • They are easy to operate. ‘+’ operator for concatenation, ‘=’ for assignment, can be compared using regular operators.
  • string::find() and many other functions can be implemented on std::string and not on C-Strings so this becomes handy.
  • Iterators can be used in std::string and not in C-strings.

And many more! Here is the code for it:-




/* To demonstrate C style string to std::string */
#include<bits/stdc++.h>
  
using namespace std;
int main()
{
    /*Initializing a C-String */
    const char *a = "Testing"
    cout << "This is a C-String : "<< a << endl;
  
    /* This is how std::string s is assigned
       though a  C string ‘a’ */
    string s(a);  
     
    /* Now s is a std::string and a is a C-String */
    cout << "This is a std::string : "<< s << endl;
    return 0;
}

Output:

This is a C-String : Testing
This is a std::string : Testing

The above conversion also works for character array.

        // Character array to std::string conversion 
	char a[] = "Testing"; 
	string s(a); 

Converting a std::string to a C style string
Why do we need this transformation? From std::string to a C string?

  • It is because there are several powerful functions in header that makes our work very much easier.
  • atoi() , itoa() , and many more functions work with C strings only.

You can think of other reasons too!
Here is the code for conversion:-




/* To demonstrate std::string to  C style string */
#include<iostream>
#include<string> /* This header contains string class */
using namespace std;
int main()
{
    /* std::string initialized */
    string s = "Testing";  
    cout << "This is a std::string : "<< s << endl;
  
    /* Address of first character of std::string is 
       stored to char pointer a */
    char *a = &(s[0]); 
  
    /* Now 'a' has address of starting character
      of string */
    printf("%s\n", a);                 
    return 0;
}

Output:

This is a std::string : Testing
This is a C-String : Testing

std::string also has a function c_str() that can be used to get a null terminated character array.




/* To demonstrate std::string to C style string using
   c_str() */
#include<bits/stdc++.h>
using namespace std;
  
int main()
{
    /* std::string initialized */
    string s = "Testing";  
    cout << "This is a std::string : "<< s << endl;
  
    // c_str returns null terminated array of characters
    const char *a = s.c_str();
  
    /* Now 'a' has address of starting character
      of string */
    printf("%s\n", a);                 
    return 0;
}

Output:

This is a std::string : Testing
This is a C-String : Testing

Both C strings and std::strings have their own advantages. One should know conversion between them, to solve problems easily and effectively.

Related articles:

C++ string class and its applications | Set 1
C++ string class and its applications | Set 2

This article is contributed by Nishant. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.


Last Updated : 06 Jul, 2017
Like Article
Save Article
Similar Reads