CIN不接受C++中带有空格的输入?


#include <iostream>
using namespace std;
int main(){
string doi, name, address, phone;
cout<<"Please provide these credentials:n";
cout<<"1.Date of issuen";
cin>>doi;
cout<<"2.Namen";
cin>>name;
cout<<"3.Addressn";
cin>>address;
cout<<"4.Phone Numbernn";
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是一个对象;它自己不做任何事情

从输入流读取的函数属于以下两类之一:它们执行格式化输入或非格式化输入格式化输入函数将它们从输入流(此处为std::cin(获取的文本转换为它们尝试读取的数据类型:

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

格式化输入函数首先跳过空格,然后读取字符并翻译它们;当函数遇到对它们正在读取的类型无效的字符时,或者当他们看到空格时,它们会停止。所以在上面的例子中,如果你键入" 32",流提取器将跳过前导空格,读取32,看到下面的空格,然后停止读取。存储在i中的值将为 32。

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

在这里,如果您键入"Hello,world",流提取器(operator>>(将读取空间,并将"Hello,"存储在data中。

如果你想读取空格和非空格,你需要一个无格式的输入函数:

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

在这里,对getline的调用从std::cin读取文本到第一个换行符或输入流的末尾。因此,如果您为此代码键入" 32",data将保留文本" 32 "。如果您键入"你好,世界",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将为空。这是因为流提取器读取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是一个未格式化的输入函数;在此调用中,它最多读取 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

最新更新