我试图通过迭代整个字符串并输出整数来测试字符串是否包含整数。我的方法涉及将字符串转换为c-string,atoi
c-string,然后使用isdigit
函数测试其是否为整数。由于某些未知原因,isdigit
函数在遇到整数时返回false。
我需要帮助解决此问题
#include <iostream>
using namespace std;
#include <string>
int main()
{
string p = "[ab, e2cd]";
for (int k = 0; k < p.length(); k++)
{
if (isdigit(atoi(p.substr(k,1).c_str())) == true) //testing done here
{
cout << atoi(p.substr(k, 1).c_str());
}
}
}
答案 0 :(得分:3)
isdigit
在您的语言环境中使用单个字符的值int
。可以从unsigned char
传递char
强制转换,然后转换为int
。由于string
包含chars
,您可以使用它的元素:
if ( static_cast<unsigned char>(isdigit(p[k])) ) { ....
答案 1 :(得分:2)
atoi
将cstring转换为数字。如果字符串无效,你就不会知道,因为atoi
返回0,也可能是字符串中的数字。
isdigit
应该将一个字符作为int传递,如果它不是数字字符,则返回false
。所以你要比较苹果和橘子。
只需遍历字符串并将每个字符传递给isdigit()
,如果这样可行,那么您可以使用atoi
进行转换。
但可能存在一个缺陷,即字符串包含+
或-
作为数字的一部分,isdigit()
在这种情况下不会返回true
。可能还有其他字符也是有效数字的一部分,但对于简单的整数值,这应该就足够了。
答案 2 :(得分:2)
由于历史原因,isdigit
的行为相当奇怪。
它需要一个字符值,并告诉您它是否为十进制数字('0'
,'1'
,... '9'
之一) - 这意味着将其应用于atoi()
的结果很少有意义。
但字符值不是char
,而是int
,其值在unsigned char
范围内。任何其他参数值(EOF
除外,通常为-1
)会导致未定义的行为。因此,如果您要测试char
值,则应将其转换为unsigned char
;如果明文char
已签名,则省略演员会冒未定义的行为。
结果不是bool
。它是int
,对于非数字,其值为0,对于数字,其值为任意非零值。不要将相等的结果与true
进行比较。就此而言,不要将代表相等或不平等条件的任何值与false
或true
进行比较;它已经是一个条件,所以直接使用它。
如果c
是char
,请替换
if (isdigit(c) == true)
通过
if (isdigit((unsigned char)c))
或
if (isdigit(static_cast<unsigned char>(c)))