C++ cin:讀取鍵盤輸入的資料

2020-07-16 10:04:39
cin 可以用於讀取鍵盤輸入的資料。

目前為止,讀者只可以使用必要的起始值初始化變數,而無須讓使用者輸入自己的資料。這些型別的程式僅限於使用一組啟動資訊執行任務。如果決定要更改任何變數的初始值,則必須對該程式進行修改並重新編譯。

實際上,大多數程式都需要獲得某些值,然後將它們分配給變數。這意味著即使使用者希望使用不同的資訊來多次執行程式,也不需要對它進行修改。例如,計算圓面積的程式可能會要求使用者輸入圓的半徑。當完成圓面積的計算和列印時,程式可以再次執行,並且可以輸入不同的半徑。

正如 C++ 提供了 cout 物件來產生控制台輸出一樣,它還提供了一個名為 cin 的物件用於讀取控制台的輸入。下面的程式演示了如何使用 cin 來讀取使用者輸入的值:
// This program calculates and displays the area of a rectangle.
#include <iostream>
using namespace std;

int main()
{
    int length, width, area;
    cout << "This program calculates the area of a rectangle.n";
    // Have the user input the rectangle's length and width
    cout << "What is the length of the rectangle? ";
    cin >> length;
    cout << "What is the width of the rectangle? ";
    cin >> width;
    // Compute and display the area area = length * width;
    cout << "The area of the rectangle is " << area << endl;
    return 0;
}
程式輸出結果:

This program calculates the area of a rectangle.
What is the length of the rectangle? 10
What is the width of the rectangle? 20
The area of the rectangle is 200.

請注意,在第 2 行中有一個包含 iostream 檔案的 #include 語句。該檔案必須包含在使用 cin 的任何程式中。

該程式並不僅限於計算一個矩形的面積,而是可以用於計算任何矩形的面積。length 和 width 變數中儲存的值,在程式執行時由使用者輸入。

cout << "What is the length of the rectangle?
cin >> length;

在程式碼中,cout 用於顯示問題“What is the length of the rectangle?”,這稱為提示,它讓使用者明白這裡需要輸入,並提示必須輸入什麼資訊。當使用 cin 來從使用者獲取輸入時,它應該始終在一個提示之前。

然後,使用 cin 從鍵盤讀取一個值。>> 符號是流提取運算子,它從輸入流中提取字元,從而可以在程式中使用。更具體地說,流提取運算子從左側的流物件獲取字元,並將其儲存在其右側出現的變數中。在該行範例中,由 cin 讀取來自 cin 物件的字元並將它儲存到 length 變數中。

從使用者收集輸入通常有兩個步驟:
  1. 使用 cout 在螢幕上顯示提示。
  2. 使用 cin 從鍵盤讀取值。

提示應該向使用者提出一個問題,或者告訴使用者輸入一個特定的值。例如,上面程式的程式碼顯示了以下提示:

What is the length of the rectangle?

這就是告訴使用者應輸入矩形的長度。顯示提示之後,程式使用 cin 從鍵盤讀取值並將其儲存在 length 變數中。

請注意,<< 和 >> 運算子看起來像是在指示資料流動的方向。將它們視為箭頭將有助於理解。在使用 cout 的語句中,<< 運算子總是指向 cout,如下所示,表示資料是從變數或常數流動到 cout物件:

cout << "What is the length of the rectangle? ";
cout <- "What is the length of the rectangle? ";

在使用 cin 的語句中,>> 運算子總是指向接收值的變數,表示資料是從 cin 物件流動到變數:

cin >> length;
cin —> length;

cin 物件導致程式等待,直到在鍵盤上輸入資料按確認鍵。在 cin 接收到輸入之前,不會有其他的行被執行。

當使用者從鍵盤輸入字元時,它們暫時放置在稱為輸入緩衝區或鍵盤緩衝區的記憶體區域中。當 cin 讀取它們時,會自動將它們轉換為要儲存輸入資料的變數的資料型別。

例如,如果使用者鍵入 10,它將被讀取為字元 '1' 和 '0',但是 cin 足夠聰明,知道在儲存到 length 變數之前必須將其轉換為 int 值 10。但是,如果使用者輸入像 10.7 這樣的浮點數,則會出現問題。cin 知道這樣的值不能儲存在整數變數中,所以當它讀到小數點時即停止讀取,在輸入緩衝區中保留小數點和其餘數位。當下一個值被讀入時,這可能會導致出現問題。下面的程式演示了這個問題:
//This program illustrates what can happen when a
// floating-point number is entered for an integer variable.
#include <iostream>
using namespace std;

int main()
{
    int intNumber;
    double floatNumber;
    cout << "Input a number. ";
    cin >> intNumber;
    cout << "Input a second number.n";
    cin >> floatNumber;
    cout << "You entered: " << intNumber << " and " << floatNumber << endl;
    return 0;
}
程式輸出結果:

Input a number . 12.3
Input a second number. You entered: 12 and 0.3

現在來分析一下這個程式。當提示輸入第一個數位時,使用者從鍵盤輸入 12.3。但是,因為 cin 正在讀取的值將存入 intNumber 這個整型變數中,所以,當它遇到小數點,就會停止讀取,並且將 12 儲存到 intNumber 變數中。當第二個 cin 語句需要讀取一個值存入 floatNumber 變數中時,它發現在輸入緩衝區中已經有一個值,也就是從使用者第一次輸入中遺留下來的 ".3",於是就不必等待使用者輸入第二個數位,而是讀入 ".3" 並將它儲存到 floatNumber 變數中。

後面將介紹如何防止這樣的事情發生,在此只是為了說明,需要為使用者提供清晰的提示。

輸入多個值

可以使用 cin 一次輸入多個值:
// This program calculates and displays the area of a rectangle.
#include <iostream>
using namespace std;

int main()
{
    int length, width, area;
    cout << "This program calculates the area of a rectangle. n";
    //Have the user input the rectangle1s length and width
    cout << "Enter the length and width of the rectangle "
    cout << "separated by a space. n";
    cin >> length >> width;
    // Compute and display the area
    area = length * width;
    cout << "The area of the rectangle is " << area << endl;
    return 0;
}
程式輸出結果:

This program calculates the area of a rectangle.
Enter the length and width of the rectangle separated by a space.
10 20

第 14 行等待使用者輸入兩個值。第一個被賦值給 length,第二個則賦值給 width:

cin >> length >> width;

在範例輸出中,使用者輸入 10 和 20,因此 10 儲存在 length 中,而 20 儲存在 width 中。注意,使用者在輸入數位時要用空格分隔數位。這樣 cin 才能知道每個數位的開始和結束位置。在每個數位之間輸入多少空格並不重要,需要注意的是,在最後一個數位輸入之後,必須按確認鍵。

還可以使用單個 cin 語句讀取不同資料型別的多個值。下面的程式顯示了這種用法:
// This program demonstrates how cin can read multiple values
// of different data types.
#include <iostream>
using namespace std;

int main()
{
    int whole;
    double fractional;
    char letter;
    cout << "Enter an integer, a double, and a character: ";
    cin >> whole >> fractional >> letter;
    cout << "whole: " << whole << endl;
    cout << "fractional: " << fractional << endl;
    cout << "letter: " << letter << endl;
    return 0;
}
程式輸出結果:

Enter an integer, a double, and a character: 4 5.7 b
whole: 4
fractional: 5.7
letter: b

在上述範例輸出和圖 1 均可見,這些值將按照輸入的順序儲存到相應的變數中。

輸入的值將按順序存儲到相應的變量中
圖 1 輸入的值將按順序儲存到相應的變數中