Jason
Jason

Reputation: 1613

String after appending Char changning its size

I want to test what if string append char's size, and below is the outcome.

I know that the string end with the null character, but why the outcome is like that?

#include <iostream>
#include <string>
using namespace std;
int main(){
    string a = "" + 'a';    //3
    string b = "" + '1';    //2
    string c = "a" + 'a';   //2
    string d = "1" + '1';   //3
    string e = "\0" + 'a';  //20
    string f = "\0" + '1';  //1
    string g = "a" + '\0';  //1
    string h = "1" + '\0';  //1
    string i = "" + '\0';   //0
    string j = "" + '\0';   //0
    cout << a.size() << endl;
    cout << b.size() << endl;
    cout << c.size() << endl;
    cout << d.size() << endl;
    cout << e.size() << endl;
    cout << f.size() << endl;
    cout << g.size() << endl;
    cout << h.size() << endl;
    cout << i.size() << endl;
    cout << j.size() << endl;
    return 0;
}

Upvotes: 0

Views: 108

Answers (2)

Matteo Italia
Matteo Italia

Reputation: 126937

Your code is not doing what you think.

String literals decay to const char *, and char is an integer type. If you try to sum them, the compiler finds that the simplest way to make sense of that stuff is to convert chars to ints, so the result is performing pointer arithmetic over the string literals - e.g. ""+'a' goes to the 97th character in memory after the beginning of the string literal "" (if 'a' is represented by 97 on your platform).

This results in garbage being passed to the string constructor, which will store inside the string being constructed whatever it finds at these locations of memory until it founds a \0 terminator. Hence the "strange" results you get (which aren't reproducible, since the exact memory layout of the string table depends from the compiler).

Of course all this is undefined behavior as far as the standard is concerned (you are accessing char arrays outside their bounds, apart from the cases where you add \0).

To make your code do what you mean, at least one of the operands must be of type string:

string c = string("a") + 'a';

or

string c = "a" + string("a");

so the compiler will see the relevant overloads of operator+ that involve std::string.

Upvotes: 2

NPE
NPE

Reputation: 500893

Most of your initializers have undefined behaviour. Consider, for example:

string a = "" + 'a';

You are adding a char to a char pointer. This advances the pointer by the ASCII value of the char, and uses the resulting (undefined) C string to initialize a.

To fix, change the above to:

string a = string("") + 'a';

Upvotes: 1

Related Questions