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

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

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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;

chevron_right


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

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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;
}

chevron_right


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:-

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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;
}

chevron_right


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:-

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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;
}

chevron_right


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.

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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;
}

chevron_right


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.



My Personal Notes arrow_drop_up


Article Tags :
Practice Tags :


1


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.