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)没有工作。

4

5 回答 5

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 子句,因为65ASCII 码是'A'

试试@chris 提供的建议。

try
{
    int the_number = std::stoi(key);
    //do something
}
catch( std::exception& )
{
    //do something else
}
于 2013-03-02T23:51:48.140 回答
0

正如@suspectus 所做的那样,除了遍历字符串中的每个字符并isDigit改为使用它之外,它不会认为!@不是数字。

for(int i = 0; i<key.size(); i++)
{
   if(!(isdigit(key[i])))
   {
      //fails
   }
}
于 2013-03-03T01:13:11.427 回答
0

您正在定义没有内容的键,并在它返回一个指向空数组的 char 指针的情况下立即使用它的 t_str 方法。因此 atoi 总是返回零。

请参考这里http://www.cplusplus.com/reference/cstdlib/atoi/

在给定的示例中,键为空且 atoi 参数无效,因此 atoi 始终返回零

于 2013-03-02T23:40:20.273 回答
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
于 2013-03-02T23:58:09.117 回答
0

请注意,atoi用于确定字符串是否包含数字并不是很幸运的选择。如果你想确保你的字符串只包含数字,那么你能做的最好的就是遍历它的字符并检查每个字符(你可以使用std::isdigit)。

然后从这个字符串中提取整数值,在 C++11 中你可以使用std::stoi,否则你可以使用 std::istringstream

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

当以表示数字的字符串开头时,它将以成功告终。key所以它也适用于 , 等字符串42abc0x21zzz然后这取决于你的具体情况,但在这种情况下你甚至不需要任何先前的验证。

可能有帮助的相关问题:How to determine if a string is a number with C++?

于 2013-03-02T23:59:14.757 回答