isdigit无法正常工作

时间:2013-11-11 06:39:41

标签: c++ string debugging

我试图通过迭代整个字符串并输出整数来测试字符串是否包含整数。我的方法涉及将字符串转换为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());
        }
    }
}

3 个答案:

答案 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进行比较。就此而言,不要将代表相等或不平等条件的任何值与falsetrue进行比较;它已经是一个条件,所以直接使用它。

如果cchar,请替换

if (isdigit(c) == true)

通过

if (isdigit((unsigned char)c))

if (isdigit(static_cast<unsigned char>(c)))