Конкатенация Строк Литерала 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