Странное поведение стека / строки - PullRequest
1 голос
/ 25 сентября 2010
 stack <char> stck;
 string str;

 stck.push('0');

 str.append("test:");
 //test:
 cout << str << endl;

 str.append(&stck.top());
 //test:0═══════════════¤¤¤¤▌▌▌▌,╘╥XЕ┤
 cout << str << endl;

Почему это происходит?

Ответы [ 2 ]

3 голосов
/ 25 сентября 2010

Мацей Хель прав насчет почему вы получаете нежелательное поведение.

Чтобы получить желаемое поведение, вам нужно добавить сам символ, а не указатель на него. Вы правы, говоря (в своем комментарии к ответу Калима), что нет переопределения std::string::append, которое занимает всего char. Однако существует переопределение std::string::append(std::size_t, char), которое добавляет символ (второй аргумент) определенное количество раз (первый аргумент).

Итак, правильный способ написать то, что вы хотите, будет:

str.append(1, stck.top()); // Append one copy of the character at the top of the stack 

Или, наоборот, просто используйте перегрузку для оператора +=, который принимает char:

str += stck.top();
2 голосов
/ 25 сентября 2010

&stck.top() - это адрес char, который находится на вершине стека. Тип этого выражения: char*.

Перегрузка метода append, который принимает char* (фактически подпись string& append ( const char* s );) ожидает, что указатель указывает на начало строки с нулевым символом в конце, и интерпретирует аргумент таким образом. Он добавляет символ, на который указывает аргумент, а затем все последовательные символы в памяти, до первого нулевого символа. Он читает и копирует область памяти, которая не принадлежит стеку.

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