无法在 C++ 中获取包含空格的输入

Can't get input containing spaces in C++

我有以下C++代码

#include<iostream>
#include<string>

using namespace std;

struct data
{
    char   name1[20];
    string name2[20];
    string name3;
};

void main() {
    data *d = new data;

    cout << "Enter name1 : ";
    cin >> d->name1;        // this does not capture spaces in between

    cout << "Enter name2 : ";
    cin.getline(d->name2,20);   
    //compiler: cannot convert argument 1 from 'std::string [20]' to 'char *'

    cin.getline(d->name2,sizeof(d->name2));  // same as above
    getline(cin,d->name2);  
    // error C2665: 'std::getline' : none of the 2 overloads could convert all arguments type

    cout << "Enter name3 : " ;
    cin >> noskipws >> d->name3;  
    // does not even wait for input, execution resumes without my input


    cout << "name1=" << d->name1 << endl;  
    cout << "name2=" << d->name2 << endl;
    cout << "name3=" << d->name3 << endl;


}

如果我运行上面的程序(导致编译器抱怨的注释行),我会得到这样的东西:(我的输入斜体)

Enter name1: ahmad mutawa

Enter name2: any name

Enter name3:

 

name1=ahmad

name2=

name3=ahmad

我做错了什么?如何将包含空格的字符串放入字符串变量中?

我正在使用命令行工具中的 Microsoft Visual C++ 编译器cl

编辑 我按照 comments/answers 的建议重写了程序: 我将所有变量重新声明为字符串,但没有指定长度。

struct data
{
    string name1,name2,name3;
};
...
cout << "Enter name1 : ";
getline(cin, d->name1);

cout << "Enter name2 : ";
getline(cin, d->name2);

cout << "Enter name3 : ";
getline(cin, d->name3);
...

该程序允许我在每个 getline 处输入全名,但我得到的输出仅包含姓氏,其中没有一个有名字或中间的空格。

看看:getline(string)

它接受一个 "std::string"。在你的情况下,尝试

getline(cin, d->name3);
# enter a string with a space
cout << "name3=" << d->name3 << endl;

似乎声明

string name2[20];

无法正常工作。声明它就像

string name2;

getline(cin, d->name2);

会很好地工作

working_code

首先,你应该知道你原来的struct是什么意思:

struct data
{
    char   name1[20];  // an array of 20 single characters
    string name2[20];  // an array of 20 dynamic strings
    string name3;      // a single dynamic string
};

查看name2成员变量。它是 20 std::string 数组 。这意味着您可以有 20 个单独的动态字符串,并且每个字符串都由 name2[0]name2[1]name2[2] 访问,直到 name2[19].

既然你想简单地输入 3 个字符串,那么上面的结构并不能反映你想要完成的事情。更正应为:

struct data
{
    string name1; 
    string name2; 
    string name3; 
};

完成后,然后填充 std::cin 中的每个字符串,并在每个字符串中包含空格,使用 std::getline 3 次:

data d;

getline(cin, d.name1);
getline(cin, d.name2);
getline(cin, d.name3);

这里是Live Example