2012-11-07 3 views
2

C++ Можно создать дубликат:
How to parse a string to an int in C++?Преобразование строки в целое в 03

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

string text; 
cin>>text; 
int converted; 

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

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

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

+2

'повышение :: lexical_cast'. – chris

+0

К сожалению, я не могу использовать boost, поэтому я не могу использовать C++ 11. Я хотел бы найти самое элегантное и простое решение на C++ 03. – Slazer

+1

Вы не можете использовать boost, ** так что ** вы не можете использовать C++ 11? Это не имеет большого смысла. Boost работает с C++ 03, или вы хотели сказать? – chris

ответ

1

Вы можете проверить 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; 
+0

Это похоже на самый простой способ. Он даже проверяет диапазон (strtol делает также). tx – Slazer

2
const char *string = "12monkeys"; 
char *end; 
long value = std::strtol(string, &end, 10); 
if (end == string) 
    std::cout << "No number found\n"; 
else if (*end != '\0') 
    std::cout << "Extra characters on end.\n"; 
+0

Спасибо, я наконец-то посмотрю, как его использовать. Просто не забудьте изменить «const char * end» на «char * end» для его компиляции. – Slazer

+0

@ user1459339 - 'char * end', действительно верно. Вздох. Исправлена. Это мы пропустили; вызов 'strtol' превращает' const char * 'в модифицируемый символ' char * '. –

Смежные вопросы