2013-02-04 64 views
2

輸入調用後,stdin流中的Enter鍵或字符出現問題。輸入後忽略回車鍵的C代碼

比方說,我有一個輸入電話,所以我輸入的東西。 ,但隨後將Enter鍵作爲下一個輸入呼叫的輸入。

我認爲在c + +有cin.ignore()做的伎倆。

我只是找不到C版本。輸入法爲getchar()gets()

對不起,如果這是重複的。我找不到與我的相匹配的問題。 感謝您的幫助!

 printf("Do you want to view the lines? "); 
    int choice = getchar(); 
    while (choice == 'y') 
    { 
      char line[80]; 
      printf("What line do you want to see? "); 
      gets(line); 
      if (line != "all") 
      { 
        n = atoi(line); 
        printf("Line %d: %s\n",n,list[n]); 
      } 
      else 
        for (int i = 0; i<size; i++) 
          printf("%s \n",list[i]); 
      printf("Any more lines? "); 
      choice = getchar(); 
    } 

我承認這是非常基本的,但仍然在學習。

+0

您可以編寫演示該問題很短的例子程序,並把它添加到你的問題? – steveha

+0

我已編輯它steveha – Alex

+0

可能重複的[程序不等待用戶輸入scanf(「%c」,&yn);](http://stackoverflow.com/questions/8464620/program-doesnt-wait-for-用戶輸入帶scanfc-yn) –

回答

4

您只需要不斷調用getchar即可消耗流中不需要的字符。如果你知道總有一個額外的字符,那麼只需要撥打一個額外的電話getchar即可。

如果你想從流中刪除多個字符或處理輸入可能實際上包含你真正需要的東西的情況,你可以使用下面的代碼而不是你的choice = getchar()

do 
{ 
    choice = getchar(); 
} while(choice=='\n'); // Add any other characters you may want to skip 

這將保持刪除字符(在這種情況下,只有當他們都行),但留下的選擇設置爲第一個非刪除字符。

順便說一下,您不能使用C字符串比較函數(例如,)來比較那樣的字符串(!= "all")。 strcmp()

更一般地說,C++ istream ignore可以粗略地寫成C,就像下面的代碼一樣;與stdin打電話從標準輸入跳過字符:

int ignore(FILE *stream, int n, int delim) 
{ 
    int c; 
    while(n>0) 
    { 
    c = getc(stream); 
    if(c==EOF || c==delim) 
    { 
     return c; 
    } 
    n--; 
    } 
    return(c); 
} 
+0

什麼是delim變量? – Alex

+0

@Alex:它和在你提到的C++'ignore'函數(http://www.cplusplus.com/reference/istream/istream/ignore/)中,'ignore'默認跳過1個字符並且delim是EOF,所有這些的tl; dr如果你得到了你不想要的東西,你會繼續調用getchar(),如果你簡單地調用getchar(),你將從輸入流中提取一個字符 –

+0

@Alex:我已經在一個級別上添加了一些解釋希望是適合的初學者。讓我知道,如果有什麼不清楚給你。 –