C++ isalpha始终返回0

C++ isalpha始终返回0,c++,string,int,atoi,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)也不

下面是我用来检查
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没有内容,如果它返回指向空数组的char指针,则立即使用其t_str方法。因此,atoi总是返回零

请参阅这里


在给定的示例键为空且ATOI参数无效时,ATOI始终在代码中返回0< /P>< P>,<代码>键<代码>是C++字符串。< /P>

string key;

将C++字符串转换为C字符串。

key.c_str()
这会将C字符串转换为数字。整数。(
0
如果值无法转换)

这会检查这个数字是否是字母的ASCII码

isalpha(atoi(key.c_str()))
你把C++字符串转换成一个C字符串,把它变成一个整数,然后再检查一个ASCII值,然后检查这个值是否是字母表的字母(它不会告诉你它是一个数字,而只是它是“一个字母”还是“不是一个字母”)< /P> 只有当用户输入的不是字母的数字ASCII值时,您编写的if语句才会为真。例如,输入
65
将转到else子句,因为
65
'A'

尝试一下@chris善意提供的建议

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

如果需要测试输入是否为数字-:

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
请注意,用于确定字符串是否包含数字并不是非常幸运的选择。如果您想确保字符串只包含数字,那么最好是遍历其字符并检查每个字符(您可以使用)

然后,对于从该字符串中提取整数值,在C++11中可以使用,否则可以使用:

以表示数字的字符串开头时,它将以成功结束。因此,它也适用于字符串,如
42abc
0x21zzz
,等等。这取决于您的具体情况,但在这种情况下,您甚至不需要任何以前的验证


可能有帮助的相关问题:

与@suspectras一样,除了迭代字符串中的每个字符,并使用
isDigit
,这样它就不会认为
@
是一个数字

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

for(int i=0;i您想实现什么?
isalpha
测试字符……您正在将字符串转换为int,然后出于某种奇怪的原因测试int。@arcanebreallion,类似于
try{std::stoi(key);}catch(IForgetWhichException){//不是数字}
会起作用。或者,
boost::lexical\u cast
也会为错误转换引发异常,
strtol
会给出错误信息。这并不能真正回答我的问题……无论如何,这里有一个“起作用”的例子。@ArcaneExplosion:是的,这是因为你写的代码(唉)胡说八道。
isalpha
需要一个
char
,并检查其值是否对应于字母字符的ASCII码。因此,除非字符串包含此类ASCII码的文本表示形式,否则它将返回0。只需在
c_str()之后进行检查
如果输入是
'a'和<'z'
,对于
a
z
也是如此。如果输入是int,代码将进入if语句的else分支。我假设不能信任用户做正确的事情:)@arcane小心,该代码将假定
@
!abc
5andwich
是一个数字。这将检查输入字符串是否超过0个字符,以及第一个字符是否为以下字符之一:
a b b c d e f g h j k l m n o p q r s t u v w x y z a b c d e f g h j l m n o p q r s t u w x y z
,这似乎根本不是有效的验证。我很确定,如果我对
循环使用
,并将字符串视为数组,我可以检查每个字母,以确定它是否是数字。
int val;
std::string key;
// ...
if (std::istringstream(key) >> val)
{
    // success
}
else
{
    // failure
}
for(int i = 0; i<key.size(); i++)
{
   if(!(isdigit(key[i])))
   {
      //fails
   }
}