2

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

3 回答 3

3

isdigitint您的语言环境中使用单个字符的值。可以从 a 传递一个unsigned char演员char表,然后让转换int来做它的事情。由于stringcontains chars,您可以像这样使用它的元素:

if ( static_cast<unsigned char>(isdigit(p[k])) ) { ....
于 2013-11-11T06:46:39.843 回答
2

由于历史原因,的行为isdigit相当奇怪。

它接受一个字符值,并告诉您它是否是十进制数字('0', '1', ...之一'9')——这意味着将其应用于结果atoi()很少有意义。

但是字符值不是表示为 a char,而是表示为 a ,int其值在 的范围内unsigned char。任何其他参数值(除了EOF,通常是-1)都会导致未定义的行为。所以如果你想测试一个char值,你应该把它转换为unsigned char; 如果plainchar已签名,则省略演员表可能会导致未定义的行为。

结果不是bool. 对于非数字,它的int值为 0,对于数字,它的值为任意非零值。不要将相等的结果与 进行比较true。就此而言,不要将任何表示相等或不等条件的值与falseor进行比较true;已经是条件了,直接用就行了。

如果cchar, 替换

if (isdigit(c) == true)

经过

if (isdigit((unsigned char)c))

或者

if (isdigit(static_cast<unsigned char>(c)))
于 2013-11-11T07:06:27.320 回答
2

atoi将 cstring 转换为数字。如果字符串无效,你不会知道,因为atoi返回 0,也可能是字符串中的数字。

isdigit应该将字符作为 int 传递,false如果它不是数字字符则返回。因此,您将苹果与橙子进行比较。

只需遍历字符串并将每个字符传递给isdigit(),如果可行,则可以使用atoi它来转换它。

但是,一个陷阱可能是,字符串包含+-作为数字的一部分,并且在这种情况下isdigit()不返回。true可能还有其他字符也是有效数字的一部分,但对于简单的整数值,这应该就足够了。

于 2013-11-11T06:46:08.857 回答