Странное поведение std :: string - PullRequest
0 голосов
/ 16 января 2012

У меня есть эта маленькая программа.

#include    <iostream>
#include    <string>
int main()
{
    std::string st = ('='+"10");
    std::cout<<st<<"-"<<st.c_str();
    return 0;    
}

Какой вывод вы ожидаете без его запуска?

Я получаю: -

Я работаюв такие проблемы, используя библиотеку boost :: spirit и передавая ее вывод в виде c-строк.

Я что-то упустил?Я использую gcc 4.6.1 (Ubuntu 10.10).

Ответы [ 2 ]

3 голосов
/ 16 января 2012

Это:

'=' + "10"

Вероятно, не делает то, что вы ожидаете. Вместо конкатенации он «добавляет» (арифметически) значение «ASCII» «=» к указателю на буквенную строку «10», что является переполнением буфера и вызывает неопределенное поведение.

Если вы запустите свою программу под valgrind, вы, вероятно, увидите, что она пожаловалась на это.

Вместо этого попробуйте:

std::string st = "=";
st += "10";
1 голос
/ 16 января 2012

Попробуйте вместо:

#include  <iostream>
#include  <string>
int main()
{
    std::string st = ('='+std::string("10"));
    std::cout<<st<<"-"<<st.c_str();
    return 0;
}

Примечание "10" - это const char* (указатель). Добавление к нему увеличит указатель с помощью стандартной целочисленной арифметики и не объединит строку.

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