cin在C++中不接受带空格的输入?

问题描述 投票:0回答:1
#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 "存储在地址中。

c++ c computer-science iostream cin
1个回答
3
投票

如果你想读取的字符串中有空格,你可以使用 std::getline 像这样。

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

而不是 的线路。

std::cin >> name;

注意: getline 将读取所有字符,直到一个换行符。

另外,请避免使用 using namespace std;.


2
投票

当你需要输入带空格的字符串时,你应该使用getline()来代替cin。

string name;
getline(cin,name);

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


0
投票

评论和答案里有很多糊涂的术语。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.

如果你想读取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在 idata 将是空的。这是因为流提取器读取的是 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
© www.soinside.com 2019 - 2024. All rights reserved.