isalpha всегда возвращает 0

Вот код, который я использую, чтобы проверить, key это число:

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) тоже не работал

1

Решение

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

string key;

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

key.c_str()

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

atoi(key.c_str())

И это проверяет, является ли этот номер кодом ASCII для буквы

isalpha(atoi(key.c_str()))

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

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

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

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

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

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

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

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

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

Обратите внимание, что с помощью 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и т. д. Тогда это зависит от вашей конкретной ситуации, но, возможно, в этом случае вам даже не потребуется предварительная проверка.

Связанный вопрос, который может помочь: Как определить, является ли строка числом с C ++?

0

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

for(int i = 0; i<key.size(); i++)
{
if(!(isdigit(key[i])))
{
//fails
}
}
0