光阴似箭催人老,日月如移越少年。
1.當ctrl Z單獨成行,或說它前面沒有任何字元(包括空格)時表示終止,其他情況他會被識別為一個無意義的字元。 windows下的定義,和程式無關。
2.endl是刷新流。由於cin是遇到錯誤跳出的while循環,所以不用cin.clear()刷新狀態位元也是沒辦法重新進入輸入的。你第二個程式會輸出原來輸入的字母,不是因為資料還在流裡面,而是因為運行完第一個while,輸入資料被保存在了全域物件p2中,同時由於沒有重置狀態,程式直接跳過了第二個while循環,直接輸出了p2的內容
解:兩個while循環間加入cin.clear()和cin.sync()(不想換行輸入ctrl+z還可以加個cin.ignore())
linxu :透過Ctrl+D設定EOF即可
Ctrl+D
EOF
windows 透過Ctrl+Z 設定EOF即可
Ctrl+Z
程式碼中加入cin.clear()
#include <iostream> #include <string> using namespace std; int main(){ string p1, p2; cout << "first" << endl; while (cin >> p1){// p2 += p1; } cout << p2 << endl; cin.clear();//重新清空一下流的标志位,包括EOF cout << '\n' <<"second" <<endl; while (cin >> p1){ p2 += p1; } cout << p2 << endl; return 0; }
Linux中,在新的一行的開頭,按下Ctrl-D,就代表EOF(如果在一行的中間按下Ctrl-D,則表示輸出"標準輸入"的緩存區,所以這時必須按兩次Ctrl-D); Windows中,Ctrl-Z表示EOF。 (順便提一句,Linux中按下Ctrl-Z,表示將該進程中斷,在後台掛起,用fg命令可以重新切回到前台;按下Ctrl-C表示終止該進程。) 那麼,如果真的想輸入Ctrl-D怎麼辦?這時必須先按下Ctrl-V,然後就可以輸入Ctrl-D,系統就不會認為這是EOF訊號。 Ctrl-V表示以"字面意義"解讀下一個輸入,如果想按"字面意義"輸入Ctrl-V,連續輸入兩次就行了。 引用自 阮老師的 EOF 是什麼?
Linux中,在新的一行的開頭,按下Ctrl-D,就代表EOF(如果在一行的中間按下Ctrl-D,則表示輸出"標準輸入"的緩存區,所以這時必須按兩次Ctrl-D);
Windows中,Ctrl-Z表示EOF。 (順便提一句,Linux中按下Ctrl-Z,表示將該進程中斷,在後台掛起,用fg命令可以重新切回到前台;按下Ctrl-C表示終止該進程。)
Ctrl-Z
那麼,如果真的想輸入Ctrl-D怎麼辦?這時必須先按下Ctrl-V,然後就可以輸入Ctrl-D,系統就不會認為這是EOF訊號。 Ctrl-V表示以"字面意義"解讀下一個輸入,如果想按"字面意義"輸入Ctrl-V,連續輸入兩次就行了。
引用自 阮老師的 EOF 是什麼?
1.當ctrl Z單獨成行,或說它前面沒有任何字元(包括空格)時表示終止,其他情況他會被識別為一個無意義的字元。 windows下的定義,和程式無關。
2.endl是刷新流。由於cin是遇到錯誤跳出的while循環,所以不用cin.clear()刷新狀態位元也是沒辦法重新進入輸入的。你第二個程式會輸出原來輸入的字母,不是因為資料還在流裡面,而是因為運行完第一個while,輸入資料被保存在了全域物件p2中,同時由於沒有重置狀態,程式直接跳過了第二個while循環,直接輸出了p2的內容
解:兩個while循環間加入cin.clear()和cin.sync()(不想換行輸入ctrl+z還可以加個cin.ignore())
linxu :透過
Ctrl+D
設定EOF
即可windows 透過
Ctrl+Z
設定EOF
即可程式碼中加入cin.clear()
EOF的輸入