无法在 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
处输入全名,但我得到的输出仅包含姓氏,其中没有一个有名字或中间的空格。
它接受一个 "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);
会很好地工作
首先,你应该知道你原来的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。
我有以下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
处输入全名,但我得到的输出仅包含姓氏,其中没有一个有名字或中间的空格。
它接受一个 "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);
会很好地工作
首先,你应该知道你原来的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。