在剛剛剛開始學C++代碼時遇到一個問題,這個問題導致程序不能夠完全的進行運行,看完本文後對您一定會大有幫助,下文除了學習C++代碼的基本性質外還對C++代碼的編程進行全面研究。如下代碼:
- #include
- int main()
- ...{
- char a,b;
- printf("Please input the first character:");
- scanf("%c", &a);
- printf("Please input the second character:");
- scanf("%c", &b);
- printf("The two characters are %c, %c", a, b);
- return 0;
- }
程序運行結果如下:而下面這段程序卻可以正常運行:
運行結果如下:
- #include
- int main()
- ...{
- char a;
- int b;
- printf("Please input the first character:");
- scanf("%c", &a);
- printf("Please input the second integer:");
- scanf("%d", &b);
- printf("The two characters are %c, %d", a, b);
- return 0;
- }
當時對這個問題很困惑,時間一長就慢慢淡忘了。昨天一個同學問到一個C++運算符重載的問題,如下代碼,其中的while循環起什麼作用,好像注釋掉後程序運行沒什麼差別:
- iostream& operator >> (iostream& is, b& s)
- ...{
- char temp[b::MAX] = ...{0};
- is.get();
- is.get(temp, b::MAX);
- if(strlen(temp)>0)
- ...{
- strncpy(b.str, temp, b::MAX);
- }
- while(is && is.get()!=' ')
- ...{
- continue;
- }
- return is;
- }
果然,當輸入字符串小於b::MAX時一切正常,當超過b::MAX時,當輸入完第一個字符串回車後,沒等輸入第二個字符串,程序就把b1和b2的內容都顯示出來了,而b2 的內容正是輸入的字符串超過b::MAX長度的部分,說明前面的分析是正確的。
今天又想起這個問題,突然聯想到以前C++語言的兩個scanf連用產生的問題,靈機一動,難道也是輸入緩沖區沒有自動清空產生的問題?當連續用scanf輸入兩個字符的時候,輸入第一個字符後回車。
結果換行符被當作第二個字符輸入了,scanf可不會區分什麼換行符還是普通字符,而當輸入一個字符,再輸入一個整數時,因為類型不匹配的原因,scanf會將換行符忽略而等待輸入正確的整數後才返回,所以得到了正確的結果,哈哈,原來如此!!!
可見,C++中的標准輸入流已經對於換行符做了處理,看來在C++中利用標准輸入處理特殊字符要自己做一些工作了