printf scanf函数和fflush()

时间:2016-01-04 10:58:16

标签: c printf scanf format-specifiers

当我使用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;
}

3 个答案:

答案 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;
}