isdigit函数的分段错误

时间:2017-03-04 20:35:55

标签: c segmentation-fault

我正在尝试检查第三个命令行是否为数字,所以我做了

int n;
if (!isdigit(argv[3]))
    {
        fprintf(stderr, "n MUST be a number");
        return 4;
    } else 
    {
        n = atoi(argv[3]);
        printf("%i\n",n);
    }

但我正在

Segmentation fault

然而,如果我刚刚做了

int n = atoi(argv[3]);

它运作得很好,我真的不明白为什么

2 个答案:

答案 0 :(得分:3)

DeiDei在评论中是对的。看看argv的声明方式:

int main (int argc, char *argv[])

它是一个指针数组,其中每个指针指向一个C字符串,即一个字符数组。所以argv[3]是指向第三个参数的第一个字符的指针。 (数组从0开始,但argv [0]是程序的名称)。

isdigit()声明如下:

int isdigit(int c);

所以它期待一个int,而不是一个指针。您需要取消引用您发送到isdigit的指针,如下所示:

isdigit(*argv[3])

(请记住,在C中,char是int的一个特例,所以编译器就可以了。)

答案 1 :(得分:3)

来自man isdigit: int isdigit(int c)。但argv[3]char*(地址为char),因此存在不匹配。进一步

  

参数的值必须可以表示为unsigned char或EOF的值。

由于argv[3]可能无法表示为uchar,因此行为未定义,您可能会受到分段违规。