C语言 printf scanf function and fflush()



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

最新更新