以下是我用来检查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)
也不起作用。
答案 0 :(得分: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值的内容时,您编写的if语句才会成立。例如。输入65
将转到else子句,因为65
是'A'
尝试@chris善意提供的建议。
try
{
int the_number = std::stoi(key);
//do something
}
catch( std::exception& )
{
//do something else
}
答案 1 :(得分:0)
您正在定义没有内容的键,并在它返回一个指向空数组的char指针的情况下立即使用其t_str方法。因此atoi总是返回零。
请参阅此处http://www.cplusplus.com/reference/cstdlib/atoi/
在给定的示例中,键为空,atoi参数无效,因此atoi始终返回零
答案 2 :(得分: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
答案 3 :(得分: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++?
答案 4 :(得分:0)
正如@suspectus所做的那样,除了遍历字符串中的每个字符并使用isDigit
代替,因此它不认为!
或@
是一个数字。
for(int i = 0; i<key.size(); i++)
{
if(!(isdigit(key[i])))
{
//fails
}
}