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 character
(space, 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
。
你在C中不使用'using namespace std;'你甚至不應該在C++中使用它。 – sobol6803
@ sobol6803這是用C++編寫的,只是一個快速演示而不是實際的代碼:) – Novellizator