当我使用printf()
函数然后使用scanf()
函数时,我会遇到麻烦。我在下面写代码,eclipse编译器说没有错误,也没有警告,但当我编译它时,它显示:insert array dimension insert array elements
。它不会让我插入任何内容,程序结束。我也尝试添加fflush(stdout)
,但没有任何更改。我能做什么?
int main(void) {
int *V;
int i;
int N;
printf("insert array dimension");
fflush(stdout);
scanf("%n", &N);
V=(int*)malloc(sizeof(int)*N);
if(V==NULL){
printf("n error");
fflush(stdout);
return 0;
}
printf("ninsert array elements");
fflush(stdout);
return EXIT_SUCCESS;
}
TL;DR-将scanf("%n", &N);
更改为scanf("%d", &N);
引用C11
标准第7.21.6.2章fscanf()
中的格式说明符(emphasis mine)
n
不消耗任何输入。相应的自变量应指向有符号整数,其中写入从中读取的字符数到目前为止通过该调用的输入流到CCD_ 10函数。执行%n
指令不递增在CCD_ 12函数的执行完成。没有转换任何参数,但是一个被消耗掉了。如果转换规范包含抑制赋值字符或字段宽度,则行为未定义。
所以,基本上,
scanf("%n", &N);
不将输入值存储到N
,而是尝试存储从到目前为止的输入流",在您的情况下可能是0。
因此,稍后在malloc()
的情况下,如果您传递0大小,它可以返回NULL,也可以返回只能传递给free()
的指针。稍后使用该指针将调用未定义的行为。
如果您首先检查scanf()
的返回值,您就可以调试该问题。
您需要有int
的正确格式说明符,即%d
。
转换此行scanf("%n",&n);使用scanf("%d",&N);工作良好。
您需要用'%d'更改'%n'
int main(void) {
int *V;
int i;
int N;
printf("insert array dimension");
fflush(stdout);
scanf("%d", &N);
V=(int*)malloc(sizeof(int)*N);
if(V==NULL){
printf("n error");
fflush(stdout);
return 0;
}
printf("ninsert array elements");
fflush(stdout);
return EXIT_SUCCESS;
}