2013-11-22 89 views
0

我的程序編譯正常,但它調用getinput()函數時,它永遠不會提示輸入。C程序跳過fgets

爲了顯示更多代碼,我添加了fflush,但仍然因爲某種原因跳過它。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 


main(){ 

    char mystring[] = "It's equal to it. "; 
    int k = 32; 
    int e; 
    printf("Enter a number: "); 
    scanf("%d",&e); 
    if(e == k){ 
     printf("\n\n%s\n",mystring); 

    } else if(e < k){ 
     printf("\n\n%d\n",e); 

    } else { 


     getinput(); 
    } 

    exit(0); 

} 

int getinput(){ 

    char gettext[64]; 

    printf("Enter text here: "); 
    fflush(stdout); 
    fgets(gettext, 64, stdin); 
    printf("\n\nYou entered: %s\n\n",gettext); 
    return 0; 


} 
+0

Your title says它跳過'fgets',但你的問題更多地是關於'printf'。 – Barmar

+0

@WillBD看起來這個問題是一個不同的問題,因爲混合了'scanf'和'fgets'。 – Barmar

+0

啊,好的一點,我沒有看到你的評論(因此重新閱讀了這個問題),直到我把礦井放好之後,才發現。 – WillBD

回答

1

嘗試在第一次printf後調用fflush(stdout);

printf將刷新爲你,但只有當它有一個新行末(如printf("hi\n");

+0

這是真的,OP應該這樣做。但是,這並不是他問到的問題的原因。 –

+0

這可能是 - 他或她認爲輸入是錯誤的,但他通過*輸出*來判斷......因此我的答案。 – noelicus

2

此行後scanf("%d",&e)添加getchar()這樣的:

scanf("%d",&e); 
getchar(); 

當您按下Enter換行符保留在緩衝區中,所以當fgets被調用時,換行符被傳遞給它,它就像您按下時一樣活動Enter

+0

你對這裏發生的事情有正確的想法。但是,'getchar()'不是一個可靠的修復。我認爲有一種方法可以在scanf()格式中添加一些額外的東西來讓它「吃」剩下的部分,但我仍然在制定最好的方法來做到這一點。當我有更多的細節時,我會發布... –

+0

好吧,這似乎是工作:'scanf(「%d%* [^ \ n]」,&e); assert('\ n'== getchar()); '當然這個斷言是可選的(但是getchar()不是)我只是想確定我正在吃換行符,而不是偶然的其他字符。我添加的'%* [^ \ n]'基本上說「匹配不是換行符的所有內容」('[^ \ n]'模式)「,但不要將它分配給任何變量」(這就是'*'所做的)。 –