Я пытаюсь использовать 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
?
Поэтому 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
блоки, если вы хотите, чтобы они обрабатывали по-разному.
Уже есть хорошие ответы, рекомендующие C ++ API-интерфейсы std :: stoi и boost :: lexical_cast.
atoi () — это C API, и он не работает даже в 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);