isdigit 函数上的分段错误

Yas*_*imi 0 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);
    }
Run Code Online (Sandbox Code Playgroud)

但我得到

Segmentation fault
Run Code Online (Sandbox Code Playgroud)

但是,如果我只是这样做

int n = atoi(argv[3]);
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

int main (int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

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

isdigit() 声明如下:

int isdigit(int c);
Run Code Online (Sandbox Code Playgroud)

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

isdigit(*argv[3])
Run Code Online (Sandbox Code Playgroud)

(请记住,在 C 中,char 是 int 的特例,因此编译器可以接受。)