[英]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::cin
是object ; 它自己不做任何事情。
從輸入流中讀取的函數屬於以下兩類之一:它們執行格式化輸入或未格式化輸入。 格式化輸入函數將從輸入 stream (此處為std::cin
)獲得的文本轉換為他們嘗試讀取的數據類型:
int i;
std::cin >> i; // operator>> reads text and translates it into an integer value
格式化輸入函數從跳過空格開始,然后讀取字符並翻譯它們; 當 function 遇到對他們正在閱讀的類型無效的字符時,或者當他們看到空格時,他們會停止。 所以在上面的例子中,如果你輸入“32”,stream 提取器會跳過前導空格,讀取3
和2
,看到下面的空格,然后停止讀取。 存儲到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 提取器讀取3
和2
,然后看到一個換行符,然后停止,將換行符留在輸入緩沖區中。 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.