#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.orggetline-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
.
如果你想读取whitespace和非whitespace,你需要一个非格式化的输入函数。
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",你会得到32。
另一方面,如果你输入两行输入,第一行输入 "32",第二行输入 "Hello, world",你会得到32在 i
但 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