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