2013-04-13 36 views
5

在下面的程序,我希望進入一個字,打回車鍵後,我應該立即看到消息printf編出來。但是,直到我輸入其他隨機單詞纔會發生。這是爲什麼?scanf - 程序等待另一個像?

#include <cstdio> 
#include <cstdlib> 

using namespace std; 

char tictac[17]; 

int main() 
{ 
    scanf("%s\n", tictac); 


    printf("%s\n", tictac); 
    return 0; 
} 
+1

你在C中不使用'using namespace std;'你甚至不應該在C++中使用它。 – sobol6803

+1

@ sobol6803這是用C++編寫的,只是一個快速演示而不是實際的代碼:) – Novellizator

回答

4

tl; dr:使用scanf("%s\n", tictac);您要求讀取一個字符串,忽略後面的所有空白字符,然後再讀一行。問題是因爲所有的空白都被忽略了,第一個應該至少有一個非空字符,在第一個輸入和第二個輸入(因此需要一些垃圾非空白輸入之前第二個輸入被接受。)。


以下是使用scanf的\ n示例用法。

char x, y; 
scanf("%c", &x); 
scanf("%c", &y); 
printf("%c %c", x,y); 

與此代碼,你會看到,輸入一個字母,然後按Enter鍵直接到printf聲明。這是因爲第二個scanf將回車(本身是一個字符)讀入y。

scanf("\n%c", &y); // This is recommended to do if you have a sequence of scanfs (but not on the first one). 

有了這一個雜散回車將與\n被忽略(或匹配)。並且正確的字符將被讀入y。


現在,當我們來到你的代碼

scanf("%s\n", tictac); 

%s告訴scanf讀取直到它找到一個blank characterspace, tab or new line),然後這裏是抓忽略所有的空格,直到非空白字符符合。所以,你scanf會忽略輸入當你輸入的字符串你按下。 及隨後任何空白字符(嘗試在第二行,然後按輸入空格輸入。

這意味着這會工作得很好(不像字符版本)

scanf("%s", tictac); 
scanf("%s", tictac2); 

其實Windows

因爲「%s」導致庫讀取輸入字符串,直到它 發現一些空格,等效格式說明是 「%[^ \ 0×20 \噸\ n]的」,其指示庫讀取直到 它遇到一個空格字符的字符串(\ 0×20),製表符(\ t)或 換行符(\ n)。

但是既然你已經明確要求scanf匹配\n

scanf("%s\n", tictac); 
     ^^ 

它會等待,直到它得到另一個\n(非空白字符之後),因爲第一個一人使用%s

+0

您能否澄清一下scanf?如果我得到它正確的scanf(「%s \ n」,var)首先讀取到var中的字符串(直到空白)並忽略緊跟在字符串後面的空格(所以即使是我輸入的命令)。然後它等待新行「\ n」? PS:我正在使用cstdio來獲得高性能和低內存消耗。 – Novellizator

+0

@Novellizator這並不意味着新的一行。這意味着在每次輸入之後等待「回車」(鍵盤上的輸入)。試試這個'scanf(「%d%d%d」,&x,&y,&z);''和'scanf(「%d \ n%d \ n%d」,&x,&y,&z);'你會看到區別 – 2013-04-13 23:35:53

+0

試過這個例子上面 - 我看不出差別......在這兩種情況下,我都試圖將所有數字寫在一行中,同時按Enter鍵輸入每一個值,但這兩種情況都不一樣。 – Novellizator

1

有一個很好的解釋scanf here。在你的情況下,你應該從你的scanf函數中刪除\ n。