cin和scanf的返回值知多少

hisun9發表於2024-10-30

cin的返回值

在 C++ 中,cin 是用於從標準輸入(通常是鍵盤)讀取資料的物件。

cin 的返回值實際上是一個流物件(std::istream 型別),可以透過流的狀態來檢查輸入操作是否成功。

以下是一些關於 cin 返回值的關鍵點:

  1. 輸入成功與失敗:

    當你使用 cin 進行輸入時,可以透過 cin 的狀態來判斷輸入是否成功。例如:

    int x;
    if (cin >> x) {
        // 輸入成功
    } else {
        // 輸入失敗
    }
    

    如果輸入成功,cin 會返回一個指向 std::istream 物件的引用,這個引用可以被隱式轉換為 bool,在成功時為 true,失敗時為 false。

  2. 錯誤狀態:

    如果輸入格式不匹配(例如,期望一個整數但輸入了字母),cin 會進入錯誤狀態,此時:

    • cin.fail() 返回 true。

    • cin.clear() 可以用於清除錯誤狀態,使流恢復為可用狀態。

    • cin.ignore() 可以用於忽略流中的剩餘字元,直到遇到換行符或指定的字元。

  3. EOF:

    當輸入結束(例如,使用 Ctrl+D 在 Unix/Linux 上或 Ctrl+Z 在 Windows 上),cin 也會進入 EOF 狀態,此時可以透過 cin.eof() 檢查。

  4. 舉一個例子

    #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;
    }
    

    輸出如下:

    img

    img

  5. 附上《c++_primer》這本書裡面的一句話(p13):

    當我們使用一個istream物件作為條件時,其效果是檢測流的狀態。如果流有效的,即流未遇到錯誤,那麼檢測成功。當遇到檔案結束符(end-of-file),或遇到一個無效輸入時(例如期待讀入一個整數,但讀入的值不是一個整數),istream物件的狀態會變為無效,處於無效狀態的istream物件會使條件變為假

scanf的返回值

scanf 的返回值是一個整數,表示成功讀取的輸入項的數量。

具體情況如下:

  1. 成功讀取:
  • 如果 scanf 成功讀取到所需數量的輸入項(如 %d %d 需要讀取兩個整數),它返回成功讀取的項數。

    例如:如果成功讀取兩個整數,返回值為 2。

  • 如果只成功讀取一個整數(例如,第二個輸入不符合格式),返回值為 1。

  1. 輸入結束:

    如果在讀取過程中遇到檔案結束符(EOF),scanf 將返回 EOF(通常是 -1),表示沒有更多的資料可供讀取。

  2. 輸入錯誤:

    如果輸入的格式與預期不匹配,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;
} 

輸出如下:

img

相關文章