cin的返回值
在 C++ 中,cin
是用於從標準輸入(通常是鍵盤)讀取資料的物件。
cin
的返回值實際上是一個流物件(std::istream
型別),可以透過流的狀態來檢查輸入操作是否成功。
以下是一些關於 cin 返回值的關鍵點:
-
輸入成功與失敗:
當你使用 cin 進行輸入時,可以透過 cin 的狀態來判斷輸入是否成功。例如:
int x; if (cin >> x) { // 輸入成功 } else { // 輸入失敗 }
如果輸入成功,
cin
會返回一個指向std::istream
物件的引用,這個引用可以被隱式轉換為 bool,在成功時為 true,失敗時為 false。 -
錯誤狀態:
如果輸入格式不匹配(例如,期望一個整數但輸入了字母),cin 會進入錯誤狀態,此時:
-
cin.fail()
返回 true。 -
cin.clear()
可以用於清除錯誤狀態,使流恢復為可用狀態。 -
cin.ignore()
可以用於忽略流中的剩餘字元,直到遇到換行符或指定的字元。
-
-
EOF:
當輸入結束(例如,使用 Ctrl+D 在 Unix/Linux 上或 Ctrl+Z 在 Windows 上),cin 也會進入 EOF 狀態,此時可以透過
cin.eof()
檢查。 -
舉一個例子
#include <iostream> using namespace std; int main() { int num; cout << "請輸入一個整數:"; while (cin >> num) { cout << "你輸入的整數是: " << num << endl; cout << "請輸入一個整數(輸入非整數將退出):"; } // 處理輸入錯誤或EOF if (cin.fail()) { cout << "輸入無效,程式退出。\n"; cin.clear(); // 清除錯誤狀態 cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略剩餘輸入 } return 0; }
輸出如下:
-
附上《c++_primer》這本書裡面的一句話(p13):
當我們使用一個
istream
物件作為條件時,其效果是檢測流的狀態。如果流有效的,即流未遇到錯誤,那麼檢測成功。當遇到檔案結束符(end-of-file),或遇到一個無效輸入時(例如期待讀入一個整數,但讀入的值不是一個整數),istream
物件的狀態會變為無效,處於無效狀態的istream
物件會使條件變為假
scanf的返回值
scanf
的返回值是一個整數,表示成功讀取的輸入項的數量。
具體情況如下:
- 成功讀取:
-
如果 scanf 成功讀取到所需數量的輸入項(如 %d %d 需要讀取兩個整數),它返回成功讀取的項數。
例如:如果成功讀取兩個整數,返回值為 2。
-
如果只成功讀取一個整數(例如,第二個輸入不符合格式),返回值為 1。
-
輸入結束:
如果在讀取過程中遇到檔案結束符(EOF),scanf 將返回 EOF(通常是 -1),表示沒有更多的資料可供讀取。
-
輸入錯誤:
如果輸入的格式與預期不匹配,scanf 會返回成功讀取的項數(可能為 0),並且不會將任何值儲存到變數中。例如,如果期待一個整數但輸入的是字母,返回值將是 0。
給出一個C程式來驗證:
#include <stdio.h>
int main()
{
int x = 0, y = 0;
for (int i = 1; i <= 4; i ++ )
{
int res = scanf("%d %d", &x, &y);
printf("scanf的返回值:%d\n", res);
// 清空緩衝區,避免上次輸入的不合法的內容仍然在緩衝區中,影響下次讀入
int c;
while ((c = getchar()) != '\n' && c != EOF); // 讀取直到換行或檔案結束
}
return 0;
}
輸出如下: