总是返回0
isalpha always returns 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)
也不起作用
在你的代码中,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
}
}
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 矩阵向量乘法(cublasDgemv)返回零
- 为什么模板类中的对象不能返回值