2011-10-19 78 views
2

我的一個朋友正在嘗試學習c(她自己和一本書),有時她會尋求幫助。我不明白爲什麼我不能在c中得到三個輸入

她只是給了我一些我無法回答的東西;我很慚愧,但我在大學學習了C,然後轉移到了PHP。我很困難,所以我想知道爲什麼我們不能得到三個輸入。這裏的部分代碼:

#include <stdio.h> 

int main() 
{ 
    int num1; 
    int num2; 
    char x; 

    printf("Enter a number:\n"); 
    scanf("%d\n",&num1); 
    printf("Enter another number:\n"); 
    scanf("%d\n",&num2); 
    printf("Choose an operation sign:\n"); 
    scanf("%c\n",&x); 

... 

喜歡這個詢問的第一個輸入兩次,就像這樣:

Enter a number: 
1 
2 
Enter another number: 
3 
Choose an operation sign: 
- 

如果我刪除它跳過最後一個scanf\n

你能幫我理解爲什麼嗎?

+0

注意,上面的例子輸入,你會得到'num1 == 1','num2 == 2','x =='3''。 –

+1

如果您刪除\ n,程序不會跳過上一次scanf。相反,\ scanf中仍留在緩衝區中的\ n存儲在變量x中。 – Farhan

回答

4

這裏閱讀:scanf() leaves the new line char in buffer?

解決方案:

int main() 
{ 
    int num1; 
    int num2; 
    char x; 

    printf("Enter a number:\n"); 
    scanf("%d",&num1); 
    printf("Enter another number:\n"); 
    scanf("%d",&num2); 
    printf("Choose an operation sign:\n"); 
    scanf("\n%c",&x); /* See the \n <---------------- */ 
} 

一種替代方案:

char buf[2]; /* We need 2 characters for the null */ 
scanf("%1s", buf); /* We ask max 1 character (plus null given by scanf) */ 
char x = buf[0]; /* We take the first character */ 

作爲一個小紙條,感謝如何scanf的作品,同時與解決方案,您可以直接插入在第一個「輸入」中的所有數據和各種scanf將採取他們的一部分。所以你可以插入123 234 +,它會被正確地分成三個變量。

+2

看到這個問題的另一種方式,以確保所有的垃圾從標準偏差之間刷新: [我無法刷新標準輸入](http://stackoverflow.com/questions/2187474/i-am-not-able-to -flush-stdin) –

+0

@Daniel最後沒有「便攜」解決方案。即使C FAQ告訴它,並建議替代http://c-faq.com/stdio/stdinflush2.html – xanatos

+0

@xanatos您列出的C常見問題解答頁面有一個用於清除緩衝區的可移植代碼片段:P – Farhan

0

您也可以嘗試使用fflush,但它取決於庫實現(stdio)。 它的C參考可以找到here

我稍後會對此進行測試並更新我的帖子,並說明它是否有效。

+0

在輸入流上調用fflush會導致未定義的行爲。 – Farhan

+0

取決於編譯器,VC清空輸入流。當然,這是非常不便攜的。 – SvenS

+0

不在編譯器上,而是實際的庫實現(如參考資料中所述)。這意味着更新庫時行爲可能會發生變化。但出於學習目的,您可以使用它,因爲它不是一個生產環境,您可能需要長期支持或可移植性。 –

1

是,scanf不會刪除換行,你不能刷新stdin,所以這個怎麼樣:

int num1; 
char nleater; 
printf("Enter a number:\n"); 
scanf("%d%c", &num1, &nleater); 

或確實這樣:

printf("Enter number sign number: "); 
scanf("%d %c %d",&num1,&x,&num2); 
printf("%d %c %d", num1, x, num2); 
相關問題