剛開始學C語言時遇到一個問題
如下代碼
以下是引用片段
#include
int main()
{
char ab;
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 ;
}
程序運行結果如下
而下面這段程序卻可以正常運行
以下是引用片段
#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 ;
}
運行結果如下
當時對這個問題很困惑時間一長就慢慢淡忘了
昨天一個同學問到一個C++運算符重載的問題如下代碼其中的while循環起什麼作用好像注釋掉後程序運行沒什麼差別
以下是引用片段
iostream& operator >> (iostream& is b& s)
{
char temp[b::MAX] = {};
isget();
isget(temp b::MAX);
if(strlen(temp)>)
{
strncpy(bstr temp b::MAX);
}
while(is && isget()!= )
{
continue;
}
return is;
}
其中b為一個自定義的類型其中含有一個 char str[b::MAX] 的私有成員b::MAX為一個代表字符串長度的宏定義
可見當通過>>輸入字符串的長度超過b::MAX長度時while循環就起作用了它會丟棄超過b::MAX長度的輸入緩沖區的內容直到換行符出現為止實際上就是一個清緩沖區的功能以待下一次重新輸入字符串為了驗證我的分析做了如下測試
以下是引用片段
b b b;
cin >> b;
cin >> b;
bshow();
bshow();
果然當輸入字符串小於b::MAX時一切正常當超過b::MAX時當輸入完第一個字符串回車後沒等輸入第二個字符串程序就把b和b的內容都顯示出來了而b 的內容正是輸入的字符串超過b::MAX長度的部分說明前面的分析是正確的
今天又想起這個問題突然聯想到以前C語言的兩個scanf連用產生的問題靈機一動難道也是輸入緩沖區沒有自動清空產生的問題?當連續用scanf輸入兩個字符的時候輸入第一個字符後回車結果換行符被當作第二個字符輸入了scanf可不會區分什麼換行符還是普通字符而當輸入一個字符再輸入一個整數時因為類型不匹配的原因scanf會將換行符忽略而等待輸入正確的整數後才返回所以得到了正確的結果哈哈原來如此!!!
不禁又想C++中引入了新的iostream流庫它又是怎樣處理這個問題的呢?於是做了下面的實驗
以下是引用片段
#include
using namespace std;
int main()
{
char a b;
cout << Please input the first character:;
cin >> a;
cout << Please input the second character:;
cin >> b;
cout << a << << b;
return ;
}
當輸入a回車輸入b回車時運行結果如下
當連續輸入多個字符時運行結果如下
可見C++中的標准輸入流已經對於換行符做了處理看來在C++中利用標准輸入處理特殊字符要自己做一些工作了
From:http://tw.wingwit.com/Article/program/net/201311/13289.html