程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C與C++中標准輸入實現方式上的區別

C與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為一個自定義的類型,其中含有一個 char str[b::MAX] 的私有成員,b::MAX為一個代表字符串長度的宏定義。

可見,當通過>>輸入字符串的長度超過b::MAX長度時,while循環就起作用了,它會丟棄超過b::MAX長度的輸入緩沖區的內容,直到換行符出現為止,實際上就是一個清緩沖區的功能,以待下一次重新輸入字符串。為了驗證我的分析,做了如下測試:

b b1, b2;
cin >> b1;
cin >> b2;
b1.show();
b2.show();

果然,當輸入字符串小於b::MAX時一切正常,當超過b::MAX時,當輸入完第一個字符串回車後,沒等輸入第二個字符串,程序就把b1和b2的內容都顯示出來了,而b2 的內容正是輸入的字符串超過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 0;
}

當輸入a回車,輸入b回車時,運行結果如下:

當連續輸入多個字符時,運行結果如下:

可見,C++中的標准輸入流已經對於換行符做了處理,看來在C++中利用標准輸入處理特殊字符要自己做一些工作了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved