Вот код, который я использую, чтобы проверить, 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)
тоже не работал
В вашем коде 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
}
Вы определяете ключ без содержимого и немедленно используете его метод t_str в случае, если он возвращает указатель на пустой массив. Поэтому atoi всегда возвращает ноль.
Пожалуйста, обратитесь сюда http://www.cplusplus.com/reference/cstdlib/atoi/
В данном примере ключ пуст и параметр atoi недопустим, так что atoi всегда возвращает ноль
Если вам нужно проверить, является ли ввод числовым или нет:
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
Обратите внимание, что с помощью 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 ++?
Как и @suspectus, за исключением повторения каждого символа в строке и использования isDigit
вместо этого так не думает !
или же @
это число.
for(int i = 0; i<key.size(); i++)
{
if(!(isdigit(key[i])))
{
//fails
}
}