我有以下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
输入一个全名,但我得到的输出只包含姓氏,其中没有一个有名字或中间的空格。
答案 0 :(得分:3)
答案 1 :(得分:1)
它接受&#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。