2013-03-02 4 views
1

Вот код, который я использую его, чтобы проверить key не является ли номер:ISALPHA всегда возвращает 0

string key; 
cin>>key; 
if(isalpha(atoi(key.c_str())) == 0) 
{ 
    //do something 
} 
else 
    //do something else 

Независимо от того, что я вход, isalpha всегда == 0. Я пробовал рассматривать его как логическое, используя if(isalpha(atoi(key.c_str()))), но он делает то же самое.

Ключ должен быть int, но cin.fail() и !(cin>>key) также не работал.

+0

Что вы пытаетесь достичь? 'isalpha' проверяет char ... вы преобразуете строку в int и затем проверяете int по какой-то нечетной причине. – David

+0

@OliCharlesworth Я использую его, чтобы проверить, есть ли что-то. Это предотвращает ошибки. – SemicolonExpected

+3

@ArcaneExplosion, что-то вроде 'try {std :: stoi (key);} catch (IForgetWhichException) {// not number}' будет работать. Кроме того, 'boost :: lexical_cast' также генерирует исключение для плохого преобразования, а' strtol' предоставит информацию об ошибке. – chris

ответ

0

Вы определяете ключ без содержимого и используете его метод t_str немедленно в случае, когда он возвращает указатель на пустой массив. Поэтому atoi всегда возвращает ноль.

Пожалуйста, обратитесь сюда http://www.cplusplus.com/reference/cstdlib/atoi/

На данном примере ключ пуст и параметр atoi недействителен таким образом, что atoi всегда возвращает нулевое

2

В вашем коде, key это строка C++.

string key; 

Это преобразует строку C++ в строку C.

key.c_str() 

Это преобразует строку C в число. Целое число. (0, если значение не может быть конвертировано)

atoi(key.c_str()) 

И это проверяет, что ли число является ASCII код для письма

isalpha(atoi(key.c_str())) 

Вы превращающая строку C++ в строку C до целое число до значения ASCII, а затем проверить, является ли это значение буквой алфавита (который не укажет вам, является ли это числом, только ли это «буква» или «не буква»)

если заявление, которое вы написали, будет истинным только тогда, когда пользователь вводит что-то, что не является числовым значением ASCII буквы. Например. ввод 65 будет идти в положение else, поскольку 65 является кодом ASCII для 'A'

Попробуйте предложение @chris любезно предлагает.

try 
{ 
    int the_number = std::stoi(key); 
    //do something 
} 
catch(std::exception&) 
{ 
    //do something else 
} 
0

Если вам необходимо проверить, если входной числовой ИЛИ НЕ:

string key; 
cin>>key; 
if (key.size() && isalpha(*(key.c_str())) 
{ 
    //do something with non-numeric input 
} 
else 
    // numeric input, use atoi to get integer value 
+0

Если вход был int, код должен был ввести ветку else оператора if. Я предполагаю, что пользователю нельзя доверять, чтобы делать правильную вещь :) – suspectus

+0

@ArcaneExplosion осторожно, этот код будет считать, что '@' или '! Abc' или' 5andwich' является числом. –

+1

Это проверяет, является ли входная строка длиннее, чем 0 символов И является ли первый символ одним из следующих: 'a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z', который вообще не является полезной валидацией. – LihO

0

Обратите внимание, что с помощью atoi для определения того, содержит ли строка номер не очень Удачный выбор. Если вы хотите удостовериться, что ваша строка содержит только цифры, то лучшее, что вы можете сделать, это перебрать ее символы и проверить каждый символ (вы можете использовать std::isdigit).

Тогда для извлечения интегрального значения из этой строки, в C++ 11 вы можете использовать std::stoi, в противном случае вы можете использовать std::istringstream:

int val; 
std::string key; 
// ... 
if (std::istringstream(key) >> val) 
{ 
    // success 
} 
else 
{ 
    // failure 
} 

, который будет в конечном итоге с успехом когда key начинается с строка, представляющая число. Таким образом, он также будет работать для строк, таких как 42abc, 0x21zzz и т. Д. Тогда это зависит от вашей конкретной ситуации, но, возможно, вам даже не понадобится какая-либо предыдущая проверка в этом случае.

вопрос по теме, которые могут помочь: How to determine if a string is a number with C++?

0

Как @suspectus сделал кроме перебора каждого символа в строке и используя isDigit вместо так что не думает, что ! или @ этим число.

for(int i = 0; i<key.size(); i++) 
{ 
    if(!(isdigit(key[i]))) 
    { 
     //fails 
    } 
} 
Смежные вопросы