总是返回0

isalpha always returns 0

本文关键字:返回      更新时间:2023-10-16

这是我用它来检查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值,然后检查该值是否为字母表中的字母(它不会告诉您它是否是数字,只会告诉您它是"字母"还是"非字母")

只有当用户输入的不是字母的ASCII值时,您编写的if语句才为真。例如,输入65将转到else子句,因为65'A' 的ASCII码。

试试@chris好心提供的建议。

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

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

请参阅此处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以表示数字的字符串开头时,

将以success结束。所以它也适用于42abc, 0x21zzz等字符串。然后,这取决于您的具体情况,但在这种情况下,您甚至不需要任何先前的验证。

相关问题,可能会有所帮助:如何确定一个字符串是否是一个数字与c++ ?

就像@ susectus所做的那样,除了迭代字符串中的每个字符并使用isDigit代替,所以它不认为!@是一个数字。

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