C ++ Буквальное объединение строк - PullRequest
8 голосов
/ 18 апреля 2011

У меня есть вопрос о конкатенации строк в 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 ]

8 голосов
/ 18 апреля 2011

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

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

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

Во втором случае вы уже создали string, а string имеет перегруженный operator+, который выполняет интуитивное объединение.

2 голосов
/ 18 апреля 2011

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

2 голосов
/ 18 апреля 2011
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'] относится к области памяти, которая может отсутствовать в адресном пространстве процесса.


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

string str = string("ab") + "c";
1 голос
/ 18 апреля 2011
"ab"

Это C-строка.

'c'

Является ли персонаж.

Попробуйте:

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

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

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

В качестве альтернативы вы можете использовать std::stringstream:

stringstream ss;
ss << "ab" << 'c';
1 голос
/ 18 апреля 2011

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

string s = string( "foo" ) + "bar";    // s will contain "foobar"
0 голосов
/ 27 августа 2015

Это встроенный в 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
0 голосов
/ 18 апреля 2011

Я думаю string str = "ab" + 'c'; работает примерно так:

string tmp = stirng("ab"); // implicit conversion
tmp = tmp + 'c'; // uses overloaded + operator
str = tmp;
0 голосов
/ 18 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...