1

我有一个需要为学校完成的练习,这让我感到困惑。我只需要提示正确的方向即可,因为这对我来说没有意义。

在 Employee 类中添加一个成员函数:

void Employee::format(char buffer[], int buffer_maxlength)

成员函数应该用员工的姓名和薪水填充缓冲区。确保不要超出缓冲区。它可以保存 buffer_maxlength 个字符,不包括 '\0' 终止符。

我没有得到的是传递给函数的参数是什么。不应该传递名称,然后将其输入缓冲区吗?或者,函数不应该不接受任何参数并填充缓冲区吗?如果缓冲区是一个参数,我如何填充它?

这里很困惑。

还没有开始编码,因为我还不明白这个练习。

不需要任何人为我编写程序,只需要提示这里发生了什么。

谢谢。

编辑:这是我到目前为止的代码,它似乎有效。我不确定的一件事是缓冲区溢出。由于我无法调整缓冲区的大小,我是否应该将其设置为我知道现有数据不会超出的大小?这似乎效率低下,但不知道还能做什么。

#include "stdafx.h"
#include <iostream>
#include <sstream>
#include <string.h>
#pragma warning(disable : 4996) // had to include this for the strcpy function, not sure why

using namespace std;

/**
A basic employee class that is used in many examples
in the book "Computing Concepts with C++ Essentials"
*/
class Employee
{
public:
   /**
   Constructs an employee with empty name and no salary.
   */
Employee();
/**
  Constructs an employee with a given name and salary.
  @param employee_name the employee name
  @param initial_salary the initial salary
*/
Employee(string employee_name, double initial_salary);
/**
  Sets the salary of this employee.
  @param new_salary the new salary value
*/
void set_salary(double new_salary);
/**
  Gets the salary of this employee.
  @return the current salary
*/
double get_salary() const;
/**
  Gets the name of this employee.
  @return the employee name
*/
string get_name() const;

void format(char buffer[], int buffer_maxlength);

private:
   string name;
   double salary;
   char buffer;
};

Employee::Employee()
{  
   salary = 0;
}

Employee::Employee(string employee_name, double initial_salary)
{  
   name = employee_name;
   salary = initial_salary;
}

void Employee::set_salary(double new_salary)
{  
   salary = new_salary;
}

double Employee::get_salary() const
{  
   return salary;
}

string Employee::get_name() const
{  
   return name;
}

void Employee::format(char buffer[], int buffer_maxlength)
{   
string temp_name;
//string space = " ";
char terminator = '\0';
double input_salary = salary;   
string s;   
stringstream output_salary;   
output_salary << input_salary;   
s = output_salary.str();
temp_name = name.c_str() + s + terminator;
strcpy(buffer, temp_name.c_str());
cout << buffer << endl; 
}


int main()
{
const int BUFFER_SIZE = 100;
char input_buffer[BUFFER_SIZE];

string temp_string;
string space = " ";

Employee bob_buffer("Buffer, Bob", 100000);
bob_buffer.format(input_buffer, BUFFER_SIZE);   

system("pause");

return 0;
}

编辑:使用 strncpy 而不是 strcpy 来防止溢出

4

3 回答 3

1

如果姓名薪水是类成员,那么您已经可以在成员函数中访问它们:无需传递它们。buffer传递的参数是您使用函数填充的参数:您的Employee类的用户将调用函数,传入一个缓冲区以填充结果。

因此,您的任务是定义Employee类 API 的一部分,提供类内部的特定表示,并了解缓冲区边界/字符串处理。

于 2012-08-26T03:27:40.603 回答
1

您的讲师要求的是可以按如下方式使用的功能:

  1. 调用者分配它选择的任何大小的缓冲区。
  2. 调用者调用Employee::format,同时传递缓冲区和缓冲区大小。
  3. Employee::format用员工姓名和薪水填充缓冲区,确保它不会写入缓冲区末尾。
  4. 调用者现在有一个 Employee 的字符串表示形式,它可以用于它需要做的任何事情(打印到控制台、保存到文件、在 GUI 小部件中显示等)。

本质上,缓冲区参数是一个返回值。 Employee::format的唯一职责是将姓名和薪水写入缓冲区以供调用者使用。考虑到这一点,您可能需要进行以下更改:

  • 您在 中有一个buffer成员Employee,看起来它可能已被添加以供format使用。这是不必要的,因为调用者负责分配缓冲区。此外,buffer参数 informat隐藏了同名的成员,因此该成员永远不会被使用。
  • cout << buffer << endl;末尾的行将format员工信息打印到控制台,但调用者可能不希望这样。 format应该只将员工信息写入缓冲区。
于 2012-08-26T06:00:03.130 回答
0

我猜您的老师要求您将姓名和薪水信息格式化到缓冲区中,并确保您的格式化文本不会超出缓冲区大小。

姓名和薪水必须是您的员工类的成员变量。

于 2012-08-26T03:24:13.557 回答