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?


person Simon    schedule 20.11.2012    source источник
comment
atoi преобразует string в int. Не с int на string, как вы сказали.   -  person Maroun    schedule 20.11.2012
comment


Ответы (4)


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

В C ++ 11 введен 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 блока, если хотите, чтобы они обрабатывались по-разному.

person Nawaz    schedule 20.11.2012

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

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

person pndc    schedule 20.11.2012

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

person Michael Krelin - hacker    schedule 20.11.2012

atoi вроде старый ... есть лучшая замена в boost lib "lexical cast".

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

or

int int_value = boost::lexical_cast<int>(string_value);
person Alireza Soori    schedule 20.11.2012