Функция вернула 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"));