gpt4 book ai didi

c++ - 在循环内使用时,使用 getline 将单词存储在 char 数组中不起作用?

转载 作者:行者123 更新时间:2023-11-30 05:04:25 25 4
gpt4 key购买 nike

我正在学习 C++ 类(class)。所以,我正在学习如何将对象数组用于一个类。当我尝试从用户那里获取名称时,如果用户输入的名称超过一个单词,则会发生以下情况,这是第一次正确接收到名称。但是第二次跳过了名称,并提示用户输入年龄而不输入名称。我尝试使用字符串而不是字符数组来获取名称,但我仍然遇到同样的问题。我尝试使用 cin.ignore()。但我仍然没有找到解决问题的办法。

我的要求:

1. 当要求用户输入时,在名称中输入多个单词。

2. 最后打印所有数据(从用户那里收到的姓名和年龄)。

提前感谢所有提供帮助的人!

代码:

// Array of objects

#include<iostream>
#include<conio.h>
//#include<string>
using namespace std;
#define SIZE 30
class employee
{
char name[SIZE];
float age;
public:
void getdata();
void putdata();
};

void employee::getdata()
{
cout << "Enter name:";
cin.getline(name, sizeof(name));
cin.ignore();

cout << "Enter age:";
cin >> age;
}

void employee::putdata()
{
cout << "Name is " << name << endl;
cout << "Age is " << age << endl;
}

const int size = 3;

int main()
{
employee manager[size];
for(int i = 0; i < size; i++){
cout << "\nThe details of the manager " << i+1 << endl;
manager[i].getdata();
}
cout << endl;

for(int i = 0 ; i < size; i++){
cout << "\nManager " << i+1 << endl;
manager[i].putdata();
}

getch();
return 0;
}

最佳答案

其实这个错误很小但很重要:

cin.ignore() 的调用可能是针对 name 输入超过 SIZE - 1 个字符的情况。因此,它的调用应该是有条件的:

The failbit flag is set if the function extracts no characters, or if the delimiting character is not found once (n-1) characters have already been written to s. Note that if the character that follows those (n-1) characters in the input sequence is precisely the delimiting character, it is also extracted and the failbit flag is not set (the extracted sequence was exactly n characters long).

(摘自 std::istream::ignore .)

现在,我只是简单地排除了它。

下面的cin >> age;读取一个 float (因为agefloat类型)。输入流中保留了以下分隔符。因此,下一个输入将收到它,这是下一个经理的名字。

我的第一个想法是用 std::istream& std::getline(std::istream&, std::string&); 阅读它.然而,在了解了std::istream::ignore()之后, 我修改了示例 &nash;它也能正常工作。

这里是 OP 的修改示例:

// Array of objects

#include<iostream>
//#include<conio.h>
#include<string>
using namespace std;
#define SIZE 30
class employee
{
char name[SIZE];
float age;
public:
void getdata();
void putdata();
};

void employee::getdata()
{
cout << "Enter name:";
cin.getline(name, sizeof(name));
//EXCLUDED: cin.ignore();

cout << "Enter age:";
cin >> age;

//INSERTED:
// skip rest of line
#if 0 // Tried first:
string dummy; getline(cin, dummy);
#else // but now use:
cin.ignore();
#endif // 0
}

void employee::putdata()
{
cout << "Name is " << name << endl;
cout << "Age is " << age << endl;
}

const int size = 3;

int main()
{
employee manager[size];
for(int i = 0; i < size; i++){
cout << "\nThe details of the manager " << i+1 << endl;
manager[i].getdata();
}
cout << endl;

for(int i = 0 ; i < size; i++){
cout << "\nManager " << i+1 << endl;
manager[i].putdata();
}

//getch();
return 0;
}

ideone 上编译和测试.

输入:

Michael
32
Jack
48
Joseph
53

输出:

The details of the manager 1
Enter name:Enter age:
The details of the manager 2
Enter name:Enter age:
The details of the manager 3
Enter name:Enter age:

Manager 1
Name is Michael
Age is 32

Manager 2
Name is Jack
Age is 48

Manager 3
Name is Joseph
Age is 53

注意:

在ideone上测试,输入重定向。因此,它没有反射(reflect)出来,这看起来有点奇怪。但是,输出显示它已被应用程序正确接收。

关于c++ - 在循环内使用时,使用 getline 将单词存储在 char 数组中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48902110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com