The following fails with the error prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’
int main() { char d = 'd'; std::string y("Hello worl"); y.append(d); // Line 5 - this fails std::cout << y; return 0; } I also tried, the following, which compiles but behaves randomly at runtime:
int main() { char d[1] = { 'd' }; std::string y("Hello worl"); y.append(d); std::cout << y; return 0; } Sorry for this dumb question, but I've searched around google, what I could see are just "char array to char ptr", "char ptr to char array", etc.
314 Answers
y += d; I would use += operator instead of named functions.
Use push_back():
std::string y("Hello worl"); y.push_back('d') std::cout << y; To add a char to a std::string var using the append method, you need to use this overload:
std::string::append(size_type _Count, char _Ch) Edit : Your're right I misunderstood the size_type parameter, displayed in the context help. This is the number of chars to add. So the correct call is
s.append(1, d); not
s.append(sizeof(char), d); Or the simpliest way :
s += d; 4In addition to the others mentioned, one of the string constructors take a char and the number of repetitions for that char. So you can use that to append a single char.
std::string s = "hell"; s += std::string(1, 'o'); 1I test the several propositions by running them into a large loop. I used microsoft visual studio 2015 as compiler and my processor is an i7, 8Hz, 2GHz.
long start = clock(); int a = 0; //100000000 std::string ret; for (int i = 0; i < 60000000; i++) { ret.append(1, ' '); //ret += ' '; //ret.push_back(' '); //ret.insert(ret.end(), 1, ' '); //ret.resize(ret.size() + 1, ' '); } long stop = clock(); long test = stop - start; return 0; According to this test, results are :
operation time(ms) note ------------------------------------------------------------------------ append 66015 += 67328 1.02 time slower than 'append' resize 83867 1.27 time slower than 'append' push_back & insert 90000 more than 1.36 time slower than 'append' Conclusion
+= seems more understandable, but if you mind about speed, use append
Try the += operator link text, append() method link text, or push_back() method link text
The links in this post also contain examples of how to use the respective APIs.
the problem with:
std::string y("Hello worl"); y.push_back('d') std::cout << y; is that you have to have the 'd' as opposed to using a name of a char, like char d = 'd'; Or am I wrong?
1int main() { char d = 'd'; std::string y("Hello worl"); y += d; y.push_back(d); y.append(1, d); //appending the character 1 time y.insert(y.end(), 1, d); //appending the character 1 time y.resize(y.size()+1, d); //appending the character 1 time y += std::string(1, d); //appending the character 1 time } Note that in all of these examples you could have used a character literal directly: y += 'd';.
Your second example almost would have worked, for unrelated reasons. char d[1] = { 'd'}; didn't work, but char d[2] = { 'd'}; (note the array is size two) would have been worked roughly the same as const char* d = "d";, and a string literal can be appended: y.append(d);.
Also adding insert option, as not mentioned yet.
std::string str("Hello World"); char ch; str.push_back(ch); //ch is the character to be added OR str.append(sizeof(ch),ch); OR str.insert(str.length(),sizeof(ch),ch) //not mentioned above str.append(10u,'d'); //appends character d 10 times Notice I have written 10u and not 10 for the number of times I'd like to append the character; replace 10 with whatever number.
0Try using the d as pointer y.append(*d)
2I found a simple way... I needed to tack a char on to a string that was being built on the fly. I needed a char list; because I was giving the user a choice and using that choice in a switch() statement.
I simply added another std::string Slist; and set the new string equal to the character, "list" - a, b, c or whatever the end user chooses like this:
char list; std::string cmd, state[], Slist; Slist = list; //set this string to the chosen char; cmd = Slist + state[x] + "whatever"; system(cmd.c_str()); Complexity may be cool but simplicity is cooler. IMHO
1there are three ways to do this:
for example, we have code like this:
std::string str_value = "origin";
char c_append = 'c';
If you are using the push_back there is no call for the string constructor. Otherwise it will create a string object via casting, then it will add the character in this string to the other string. Too much trouble for a tiny character ;)
1