Конкатенация Строк Литерала C++

у меня вопрос о конкатенации строк в C++.

string str = "ab" + 'c';
cout << str << endl;

char ch = 'c';
string str1 = "ab";
string str2 = str1 + ch;
cout << str2 << endl;

код выдает:

ed before SaveGraphicsState
abc

может кто-нибудь объяснить обработке этой строки: string str = "ab" + 'c'; ?

8 ответов


ваша мысль относительно первой строки верна, это именно то, что происходит.

нет никакого значения по умолчанию + оператор для литеральных строк, таких как "ab" Итак, что происходит, компилятор принимает это (как строку в стиле C) и использует const char* указатель на литерал. Затем он принимает ваш буквальный символ 'c' и продвигает его к int С некоторым значением. Этот int затем добавляется в адрес литерала и используется в качестве c-строки. С тех пор как ты превысил пространство, выделенное для вашей литеральной строки, результаты не определены, и он просто распечатал символы из результирующего адреса, пока не нашел null.

если вы хотите создать строку одним выстрелом, вы можете помочь компилятору выяснить, что вы хотите преобразовать в string сначала с гипсом:std::string str = std::string("ab") + 'c';. Поочередно (как видно из отдельного комментария) делайте это с конкатенацией, которая может работать или не работать лучше. Используйте то, что кажется более ясным в вашем случае: std::string str = "ab"; str += 'c';.

во втором случае, вы уже создали string и string имеет перегруженный operator+ это делает интуитивную конкатенацию.


ваша догадка верна, за исключением того, что строковый литерал не находится в стеке, он находится в определенном для toolchain месте в памяти, часто в разделе только для чтения.


string str = "ab" + 'c';

строковые литералы не могут быть объединены, как это. "ab" - это массив символов, который распадается на указатель (в этом контексте), и вы добавляете 'c' который является интегралом от указателя. Таким образом, указатель продвигается по значению ascii 'c'.

то есть, приведенный выше код эквивалентен этому:

char char * s= "ab";
string str = &s['c']; //the ascii value of 'c' acts like an index to the array. 

Я уверен, что это не то, что вы задумали. Фактически, он вызывает неопределенное поведение, потому что &s['c'] относится к области памяти, которая может не быть в адресном пространстве процесса.


короткая форма того, что вы на самом деле хотите сделать (i.e конкатенация), это:

string str = string("ab") + "c";

работает только там, где по крайней мере один из параметров перегруженного оператора является определяемым пользователем типом (т. е. экземпляром класса), поэтому оператор + не может быть перегружен для добавления символьной строки и символа. и сделай что-нибудь разумное. В лучшем случае вы получите арифметику указателя - почти наверняка не то, что вы хотите. Обычный workround для этого является явным преобразованием:

string s = string( "foo" ) + "bar";    // s will contain "foobar"

"ab"

является C-строкой.

'c'

персонаж.

попробуй:

string str = string("ab") + "c";

если вы хотите сделать его проще, всегда есть:

string str = "ab";
str += 'c';

кроме того, вы можете использовать std::stringstream:

stringstream ss;
ss << "ab" << 'c';

"ab" Это const char *. 'c' это char. Я предполагаю, что 'c' преобразуется в целое число, указанное целое число добавляется в адрес "ab", и результирующий указатель передается 'ы. Тебе повезло,что он не разбился.

см. другие ответы о том, как правильно выполнить конкатенацию.


Я думаю string str = "ab" + 'c'; работает что-то вроде:

string tmp = stirng("ab"); // implicit conversion
tmp = tmp + 'c'; // uses overloaded + operator
str = tmp;

это встроено в C++:

#include <iostream>
#include <string>

int main()
{
    std::string s("Stand back! I've got jimmies!" "DDD");
    std::cout << "Stand back! I've got jimmies!" "DDD";
}

выход:

Stand back! I've got jimmies!DDD