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

时间:2017-01-21 09:13:54

标签: c++ cin getline

我有以下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;


}

如果我运行上面的程序(注释导致编译器投诉的行),我会得到这样的结果:(我的输入显示)

  

输入name1: ahmad mutawa

     

输入name2:任何名称

     

输入name3:

     

     

NAME1 =艾哈迈德

     

名称2 =

     

NAME3 =艾哈迈德

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

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

修改 我根据评论/答案推荐重写了该程序: 我将变量全部重新声明为字符串,而没有指定长度。

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输入一个全名,但我得到的输出只包含姓氏,其中没有一个有名字或中间的空格。

3 个答案:

答案 0 :(得分:3)

似乎声明

string name2[20];

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

string name2;

getline(cin, d->name2);

将完美无缺

working_code

答案 1 :(得分:1)

查看:getline(string)

它接受&#34; std :: string&#34;。在您的情况下,请尝试

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

答案 2 :(得分:1)

首先,您应该知道原始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