Функция вернула string.c_str() в качестве параметра неожиданного поведения atoi()

Я столкнулся с проблемой и понятия не имею, почему она возникает. По сути, у меня есть неприятная функция, которая анализирует текстовый файл и возвращает следующие записи нескольких значений, хранящихся в строке после имени нужного параметра. Это работает, и я не думаю, что необходимо публиковать его код. Но проблема в том, что внутри цикла я хочу использовать один вкладыш для назначения целочисленного значения, возвращаемого из atoi() переменной:

for (...)
{
    int fieldId = atoi(fileParser.getNextValueOfParameter("fieldIdArray").c_str());
    std::cout << fieldId << " ";
}

К сожалению, первое значение, назначенное переменной fieldId во время первого прохода цикла, всегда равно 0. Остальные значения назначены правильно.

Однако, когда вместо однострочного присваивания я использую строку для хранения текста, возвращенного моей функцией синтаксического анализа, а затем отдельно присваиваю его преобразованное числовое значение для типа int - все работает отлично:

for (...)
{
    std::string fieldIdString = fileParser.getNextValueOfParameter("fieldIdArray");
    int fieldId = atoi(fieldIdString.c_str());
    std::cout << fieldId << " ";
}

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

Эти два кода отличаются только тем, что используют временную строковую переменную для хранения текста, прежде чем преобразовать его как .c_str() внутри atoi() в качестве его параметра.

Почему это происходит? Я использую 32-битный компилятор TDM-GCC 4.7.1, если это важно.

2 ответа

В основном, atoi преобразует строку, имеющую число, в целое число, и все, что она преобразует, станет для нее возвращаемым значением ИЛИ, если быть более точным, функция atoi начинает проверку с начала строки. если он имеет цифру (только с начала), он вернет это значение в целое число. Ниже пример прояснит понятие Например

atoi("1234") 
--> it will convert string "1234" in to integer and return it 
--> i.e. ouput is 1234
atoi("1234abcd") --> i.e. ouput is 1234
atoi("a1234abcd") --> i.e. ouput is 0

Так что, если ваша строка содержит символ сначала, а затем целое число, это даст утомленный вывод. Также прочитайте http://www.cplusplus.com/reference/cstdlib/atoi/

Вы должны изменить это в C++

int fieldId = atoi(fieldIdString.c_str());

в

int fieldId = std::stoi(fieldIdString);

или же

int fieldId = std::stoi(fileParser.getNextValueOfParameter("fieldIdArray"));
Другие вопросы по тегам