isalpha总是返回0

时间:2013-03-02 23:37:37

标签: c++ string int atoi

以下是我用来检查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)也不起作用。

5 个答案:

答案 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'

的ASCII代码

尝试@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以表示数字的字符串开头时,

将以成功结束。因此它也适用于42abc0x21zzz等字符串。然后它取决于您的具体情况,但在这种情况下您甚至可能不需要任何先前的验证。

可能有用的相关问题: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
   }
}
相关问题