#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",流提取器将跳过前导空格,读取3
和2
,看到下面的空格,然后停止读取。存储在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
将为空。这是因为流提取器读取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
是一个未格式化的输入函数;在此调用中,它最多读取 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