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
}
}