2013-03-31 58 views
0

這是一個更大的程序的一部分,但是讓我發瘋的事實是程序不會等待某些東西從字符串s中的標準輸入讀取(它只是在字符串s中放入null),但是如果我首先讀取字符串s,然後讀取字符c,程序就可以正常工作。問題是我需要按照特定的順序讀取數據。 我該如何解決它?程序不會等待第二次讀取

char s[100],c; 
printf("enter character:\n"); 
c=getchar(); 
printf("enter string text:\n"); 
fgets(s,101,stdin); 
uint8_t s_len = strlen(s) - 1;   
s[s_len] = '\0'; 
printf("i have read %s\n",s); 
+1

我有同樣的問題,在這裏我已經解決了http://stackoverflow.com/questions/15340343/strings-gets-and-do-while – Mitro

+0

爲什麼你認爲你可以讀取101個字節到100個字符數組?你應該使用'sizeof s'而不是硬編碼的101.另一個bug:getchar()返回int,而不是char。而s_len應該是size_t,而不是uint8_t。 – Jens

+0

@Jens如果你不想檢查EOF,可以將'getchar'的結果存儲在'char'中。 – teppic

回答

2

當你按下第一個字符的輸入鍵,實際換行仍然留在輸入緩衝區。然後這個換行符被fgets調用讀取。

如果不同的方法,你可以通過一對夫婦來解決這個問題。首先是添加一個虛擬的getchar呼叫,以獲得換行符。這有缺點,如果你在Windows上,換行符實際上是兩個字符。

另一種解決方案是對第一個字符也使用fgets,然後使用例如sscanf來提取角色。

+0

謝謝。我不知道換行符仍然留在輸入緩衝區中。 – ironflower

1

使用

c = getchar(); 
int eatMe; 
do 
{ 
    eatMe = getchar(); 
} while (eatMe != '\n' && eatMe != EOF); 
+0

這將無法正常工作,它會覆蓋c。 – teppic

+0

@teppic是的,但是從ironFlower的代碼,他/她並不需要_really_ c的值:)因此,這種合理的(如果他/她需要c /他可以調用多個getchar()的值或使用更多優雅的fgets) –

+0

它不會工作,因爲c是'char',但必須是'int'來保存'EOF'。我強烈建議閱讀comp.lang.c常見問題解答。 – Jens