我正在尝试检查第三个命令行是否为数字,所以我做了
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]);
它运作得很好,我真的不明白为什么
答案 0 :(得分:3)
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,因此行为未定义,您可能会受到分段违规。