C++ - ошибка при использовании atoi

Я пытаюсь использовать atoi функция для того, чтобы получить преобразование из string в int, Дело в том, что у меня есть строковый массив, который содержит как целые числа, так и строковые значения.

Из того, что я прочитал, чтобы получить код ошибки, функция должна вернуть 0:

string s = "ssss";
int i = atoi(s.c_str())
if (i == 0)
    cout<<"error"<<endl;
end;

Как мне поступить, если мое строковое значение 0?

Другая проблема с этой строкой: string s = "001_01_01_041_00.png", atoi функция возвращает значение 1, Не должно ли это вернуться 0, Почему это возвращается 1?

4 ответа

Решение

Поэтому atoi небезопасно использовать. Он не обнаруживает и не сообщает программе, если ввод неверен.

C++ 11 представил std:stoi что безопасно, так как оно выдает исключение, если ввод неверен каким-либо образом. Есть также два других варианта: std::stol а также std:stoll, Смотрите онлайн документацию для деталей:

  • std::stoi , std::stol , std::stoll

Ваш код станет таким:

try {
     string s = "ssss";
     int  i = std::stoi(s); //don't call c_str() 
     //if (i == 0) no need to check!
     std::cout << i << endl;
}
catch(std::exception const & e)
{
     cout<<"error : " << e.what() <<endl;
}

Обратите внимание, что тип времени выполнения e может быть либо std::invalid_argument или же std::out_of_range в зависимости от причины броска. Вы могли бы просто написать два catch блоки, если вы хотите, чтобы они обрабатывали по-разному.

Уже есть хорошие ответы, рекомендующие C++ API-интерфейсы std:: stoi и boost:: lexical_cast.

atoi () - это API C, и он не работает даже в C, потому что вы не можете отличить сбой от успешного анализа нуля. Если вы пишите C, используйте вместо этого strtol() и friends, если вам небезразличны ошибки, потому что они сообщают о внеполосных ошибках в ERRNO.

Потому что число в 001_ равно 1, почему он должен возвращать 0? Если вы хотите обработать только один символ, просто используйте isdigit(s[0]) а также s[0]-'0', Если вы хотите улучшить проверку ошибок, чтобы увидеть, какая часть строки содержит цифру, используйте strtol,

atoi вроде старый... есть лучшая замена в лексике приведения в boost lib.

char * str = boost::lexical_cast<std::string>(int_value);

или же

int int_value = boost::lexical_cast<int>(string_value);
Другие вопросы по тегам