2016-01-04 125 views
-1

当我使用printf()函数,然后scanf()我遇到了麻烦。 我在代码的下面写道,eclipse编译器说没有错误也没有警告,但是当我编译它时,它显示:insert array dimension insert array elements。它不会让我插入任何东西,程序结束。 我也尝试添加fflush(stdout)但没有任何更改。 我能做什么?printf scanf函数和fflush()

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; 
} 
+1

为什么你用'%n'指定符来表示'int'? – haccks

+1

不要将'malloc'和朋友的结果放在C中,并且总是用'free'分配内存。 – Olaf

+0

'scanf'被认为是邪恶的,因为它执行两项任务,并在出错时将输入流保留在未知状态。如果你想确保你知道有多少输入被读取,使用'fgets()'和'sscanf()'。 – msw

回答

1

转换这一行的scanf( “%N”,& N);与scanf(“%d”,& N);工作正常。

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; 
} 
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的正确格式说明符。