簡體   English   中英

cin 不接受 C++ 中帶有空格的輸入?

[英]cin is not accepting input with space in them in C++?

#include <iostream>
using namespace std;

int main(){
    string doi, name, address, phone;
    cout<<"Please provide these credentials:\n";
    cout<<"1.Date of issue\n";
    cin>>doi;
    cout<<"2.Name\n";
    cin>>name;
    cout<<"3.Address\n";
    cin>>address;
    cout<<"4.Phone Number\n\n";
    cin>>phone;
    return 0;
}

當我輸入帶有空格的名稱時,例如(“John Doe”),而不是存儲此值是名稱,它按空格拆分值並將“John”存儲在名稱中,“Doe”存儲在地址中。

如果要讀取的字符串中有空格,則可以像這樣使用std::getline

std::getline(std::cin, name);

而不是行:

std::cin >> name;

請注意, getline將讀取所有字符,直到換行符為止。

另外,請避免using namespace std; .

當您需要輸入帶空格的字符串時,您應該使用 getline() 代替 cin。 在您的情況下,語法將是

string name;
getline(cin,name);

有關 getline https 的更多信息://www.geeksforgeeks.org/getline-string-c/

評論和答案中有很多混亂的術語。 std::cinobject 它自己不做任何事情

從輸入流中讀取的函數屬於以下兩類之一:它們執行格式化輸入或未格式化輸入 格式化輸入函數將從輸入 stream (此處為std::cin )獲得的文本轉換為他們嘗試讀取的數據類型:

int i;
std::cin >> i; // operator>> reads text and translates it into an integer value

格式化輸入函數從跳過空格開始,然后讀取字符並翻譯它們; 當 function 遇到對他們正在閱讀的類型無效的字符時,或者當他們看到空格時,他們會停止。 所以在上面的例子中,如果你輸入“32”,stream 提取器會跳過前導空格,讀取32 ,看到下面的空格,然后停止讀取。 存儲到i中的值將是 32。

std::string data;
std::cin >> data;

在這里,如果您輸入“Hello, world”,stream 提取器( operator>> )將讀取到空格,並將"Hello,"存儲在data中。

如果您想讀取空白和非空白,您需要一個未格式化的輸入 function:

std::string data;
std::getline(std::cin, data);

這里,對getline的調用從std::cin讀取文本直到第一個換行符或輸入 stream 的末尾。 因此,如果您為此代碼鍵入“32”, data將包含文本" 32 " 如果您鍵入“Hello, world”, data將包含文本"Hello, world"

請注意,如果您將格式化的輸入函數與未格式化的輸入函數混合使用,則必須小心剩余的空格:

int i;
std::string data;
std::cin >> i;
std::getline(std::cin, data);

如果你在一行中輸入“32 Hello, world”, i會得到 32,而data會得到“Hello, world”。

另一方面,如果您輸入兩行輸入,第一行輸入“32”,第二行輸入“Hello, world”,您將在i中得到 32,但data將為空。 這是因為 stream 提取器讀取32 ,然后看到一個換行符,然后停止,將換行符留在輸入緩沖區中。 std::getline然后讀取該換行符,它也停止了。 但它讀了整行:它吞下了換行符。

因此,當您的代碼從格式化輸入切換到未格式化輸入時,您必須處理輸入緩沖區中剩余的空白字符。 如果您想閱讀它們,很好; 但如果你不這樣做,你需要刪除它們:

int i;
std::string data;
std::cin >> i;
std::getline(std::cin, data); // read the rest of the line
std::getline(std::cin, data); // read the next line of text

更好的方法是使用std::cin.ignore(42, '\n');類的方法進行清理。 . std::ignore是未格式化的輸入 function; 在這個調用中,它最多讀取 42 個字符,尋找換行符。 它在讀取 42 個字符、看到換行符或到達輸入結尾時停止讀取。 這比使用std::getline(std::cin, data)更好,因為它不會將文本存儲到data中,如果行的其余部分有很多文本,這可能需要大量調整大小。 該調用更常用的形式是將std::numeric_limits<int>::max()作為大小參數傳遞; 這是一種特殊情況,它對要讀取的字符數沒有限制。 所以std::cin.ignore(std::numeric_limits<int>::max(), '\n'); 將讀取字符,直到找到換行符或到達輸入的末尾。

int i;
std::string data;
std::cin >> i;
std::cin.ignore(std::numeric_limits<int>::max(), '\n'); // flush the rest of the line
std::getline(std::cin, data); // read the next line of text

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM