Anton Golovenko
Anton Golovenko

Reputation: 644

C++ string to C string

Consider the following piece of code:

void fun (string &str1, string &str2)
{
   const char* cstr;
....
   if(strlen(cstr = (str1+str2).c_str()) < 15)
   {
      // here cstr used
   }
}

The condition itself works fine, but in the if-condition body cstr contains garbage. Why?

Upvotes: 2

Views: 193

Answers (2)

Mr.C64
Mr.C64

Reputation: 42934

I'm assuming the string in your C++ code is std::string.

str1 + str2 produces a temporary std::string object. You invoke the c_str() method on it, and you get a C-style string pointer to the data of this temporary std::string object.

When the temporary std::string goes out of scope and is destroyed, the cstr raw C-style pointer is left dangling, pointing to invalid memory.

If you need to work on the concatenated string str1 + str2, I would suggest you safely store it in a non-temporary std::string object, e.g.:

std::string s = str1 + str2;
// Work with s
if (s.length() < 15) {
    // Use s here
    ...
}

Note also that I invoked the std::string::length() method instead of the C function strlen(). You can use the std::string::size() method, as well.

In general, in C++ code, you should use convenient string classes (like std::string), instead of C-style raw string pointers.

Upvotes: 2

cigien
cigien

Reputation: 60228

In this expression:

cstr = (str1+str2).c_str()

you are taking a pointer to the temporary string str1 + str2. This temporary dies at the end of the expression, and so you have undefined behaviour when you try to read from cstr inside the if-body.

Upvotes: 9

Related Questions