What is wrong with this string assignment?

string s="abcdefghijklmnopqrstuvwxyz"
char f[]=" " (s.substr(s.length()-10,9)).c_str() " ";

I want to get the last 9 characters of s and add " " to the beginning and the end of the substring, and store it as a char[]. I don't understand why this doesn't work even though char f[]=" " "a" " " does.

Is (s.substr(s.length()-10,9)).c_str() not a string literal?


First, consider whether you should be using cstrings. In C++, generally, use string.

However, if you want to use cstrings, the concatenation of "abc" "123" -> "abc123" is a preprocessor operation and so cannot be used with string::c_str(). Instead, the easiest way is to construct a new string and take the .c_str() of that:

string s="abcdefghijklmnopqrstuvwxyz"
char f[]= (string(" ") + s.substr(s.length()-10,9) + " ").c_str();

(EDIT: You know what, on second thought, that's a really bad idea. The cstring should be deallocated after the end of this statement, so using f can cause a segfault. Just don't use cstrings unless you're prepared to mess with strcpy and all that ugly stuff. Seriously.)

If you want to use strings instead, consider something like the following:

#include <sstream>
string s="abcdefghijklmnopqrstuvwxyz"
stringstream tmp;
tmp << " " << s.substr(s.length()-10,9) << " ";
string f = tmp.str();

No, it's not a string literal. String literals always have the form "<content>" or expand to that (macros, like __FILE__ for example).

Just use another std::string instead of char[].

std::string f = " " + s.substr(s.size()-10, 9) + " ";

Need Your Help

How to run App Engine locally with Python 2.5

python google-app-engine

Just began setting up for App Engine (Python). When I run any app on http://localhost:8080 I am getting this:

Getting a “true” object from a proxy object in doctrine2

symfony2 doctrine2

Doctrine uses proxy objects to represent related objects in order to facilitate lazy loading. This is a really cool feature, but its causing an issue with something I am trying to accomplish.