当我使用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;
}
答案 0 :(得分:2)
TL; DR - 将scanf("%n", &N);
更改为scanf("%d", &N);
引用C11
标准,章节§7.21.6.2,fscanf()
,格式说明符(强调我的)
n
不消耗任何输入。相应的参数应该是指向 有符号整数将写入从中读取的字符数 到目前为止,通过此调用到fscanf
函数的输入流。执行一个%n
指令不会增加返回的赋值计数 完成fscanf
函数的执行。没有参数被转换, 但是有一个被消耗了。如果转换规范包括赋值抑制 字符或字段宽度,行为未定义。
所以,基本上,
scanf("%n", &N);
不会将输入值存储到N
,而是尝试存储“从中读取的字符数
到目前为止输入流“,在你的情况下很可能是0。
因此,稍后在malloc()
的情况下,如果传递0大小,它可以返回NULL或指针,只能传递给free()
。稍后使用该指针将调用undefined behavior。
如果您首先检查scanf()
的返回值,则本来可以调试此问题。
您需要拥有int
%d
的正确格式说明符。
答案 1 :(得分:1)
转换此行scanf("%n",& N); with scanf("%d",& N);工作正常。
答案 2 :(得分:0)
您需要更改'%n'与'%d'
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;
}