Преобразование строки в int в C ++ 03

Возможный дубликат:
Как преобразовать строку в int в C ++?

В C ++ 03 существует множество способов преобразовать строку в int. Лучшее, что я нашел до сих пор, это:

string text;
cin>>text;
int converted;

if ( !(istringstream(text) >> converted) ){
    cout<<"conversion failed\n";
}
cout<<"the converted string is "<<converted;

Проблема с этим решением в том, что оно принимает «12 обезьян» и без колебаний преобразует их в 12. Есть ли какой-нибудь простой способ проверить это и в этом случае вывести «сбой преобразования»?

Стоит отметить, что я пробовал atoi (), atol () и strtol (), но тот факт, что он возвращает 0 в случае неудачи, бесполезен. Как мне узнать, не было ли в строке «0»? Также нет проверки диапазона (кроме strtol ()). Не говоря уже о проблеме «12 обезьян», там тоже присутствует.


person Slazer    schedule 07.11.2012    source источник
comment
К сожалению, я не могу использовать boost, поэтому не могу использовать C ++ 11. Я бы хотел найти самое элегантное и простое решение на C ++ 03.   -  person Slazer    schedule 08.11.2012
comment
Вы не можете использовать boost, так вы не можете использовать C ++ 11? В этом нет особого смысла. Boost работает с C ++ 03, или вы хотели сказать и?   -  person chris    schedule 08.11.2012
comment
@chris Извините, я не понял. Не могу использовать буст. Я не могу использовать C ++ 11. Я должен использовать только C ++ 03.   -  person Slazer    schedule 08.11.2012
comment
Чтобы решить проблему с вводом 12monkeys, см. здесь   -  person jrok    schedule 08.11.2012
comment
strtol (), но тот факт, что он возвращает 0 в случае неудачи, бесполезен. Откуда мне знать ... rtfm: man strtol. Или прочитайте ответ, на который ссылается wnraman.   -  person Sebastian    schedule 08.11.2012
comment
@wnraman Я только что прочитал ветку. Хотя Дэну Молдингу не нравится метод stringstream, я не нашел причин против него, если только мне не нужно отличать переполнение / недостаток от неконвертируемой строки, или если мне не нужно использовать базу, отличную от 10.   -  person Slazer    schedule 08.11.2012
comment
@ Себастьян Извини, я не понимаю. Сайт cppreference.com сообщает, что если преобразование не может быть выполнено, возвращается 0. Есть ли что-то еще, что указывает на ошибку? Afaik errno устанавливается в ERANGE, только если есть проблема с диапазоном, а не с преобразованием.   -  person Slazer    schedule 08.11.2012


Ответы (2)


Вы можете явно проверить eof:

string text;
cin>>text;
int converted;

istringstream iss(text);
if ( !(iss >> converted) ){
    cout<<"conversion failed\n";
}
if( iss.get() != std::stringstream::traits_type::eof() ) {
    cout<<"cocnversion failed\n";
}
cout<<"the converted string is "<<converted;
person Robᵩ    schedule 07.11.2012
comment
Кажется, это самый простой способ. Он даже проверяет диапазон (strtol тоже). tx - person Slazer; 08.11.2012

person    schedule
comment
Спасибо, я наконец понял, как им пользоваться. Просто не забудьте заменить const char * end на char * end, чтобы он скомпилировался. - person Slazer; 08.11.2012
comment
@ user1459339 - char *end действительно правильно. Вздох. Фиксированный. Это то, что мы упустили; вызов strtol превращает const char* в изменяемый char*. - person Pete Becker; 08.11.2012