ошибка при использовании 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?

8

Решение

Поэтому 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 блоки, если вы хотите, чтобы они обрабатывали по-разному.

13

Другие решения

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

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

2

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

0

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

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

или же

int int_value = boost::lexical_cast<int>(string_value);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector