2016-01-04 122 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的正確格式說明符。