Почему этот код C ++ выводит длину 5 и когда я распечатываю строку, программа автоматически c завершает работу? - PullRequest
1 голос
/ 21 февраля 2020
char start = 'a';
string out=""+start;
cout<<out.length()<<endl; 

Сначала мы берем символ в стартовой переменной, затем берем make string и инициализируем стартовой переменной и печатаем его?

Ответы [ 3 ]

7 голосов
/ 21 февраля 2020
string out = "" + start;

Это дополнение не делает то, что вы думаете, 'a' приводится к int в соответствии со значением ASCI, вы перемещаете указатель на столько элементов, а затем вы ' воссоздайте строку из передаваемого вами const char*, что вызывает UB, поскольку оно указывает на какое-то недопустимое место в памяти, которое вы пытаетесь прочитать.

4 голосов
/ 21 февраля 2020

"" - это const char[1] (удерживая '\0').

Вы пытаетесь добавить к этому 'a' - таким образом он превращается в указатель, адрес которого увеличивается по сравнению с 97 ((int)'a' == 97). Теперь вы присваиваете std::string этому адресу за пределами допустимого диапазона - это неопределенное поведение.


для достижения того, что вы хотите, вы можете использовать operator""s для превратить const char[1] в std::string. Затем std::string::operator+ выполнит и правильно объединит все.

using namespace std::string_literals;

char start = 'a';
std::string out = ""s + start;
std::cout << "string: " << out << " - length: " << out.length() << std::endl;

вывод:

строка: a - длина: 1

1 голос
/ 21 февраля 2020

Преобразование символа в строку, и это работает ->

char start = 'a';
std::string s(1, start);
std::cout << s.length() << endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...