【问题标题】:I am stuck with this struct in C++我被 C++ 中的这个结构困住了
【发布时间】:2021-08-26 18:02:25
【问题描述】:

我目前正在学习 C++ 中的“结构”并坚持:

#include "iostream"
#define SIZE 100

struct date{
  int day;
  int month;
  int year;
};

typedef struct{
  char *name;
  struct date date_of_birth;
  int score;
} person;

void entry(person *roster){
  person temp;
  std::cout << "Input name: " << '\n';
  gets(temp.name);
  std::cout << "Date of birth: " << '\n';
  std::cin >> temp.date_of_birth.day;
  std::cin >> temp.date_of_birth.month;
  std::cin >> temp.date_of_birth.year;
  std::cout << "Score: " << '\n';
  std::cin >> temp.score;
  *roster = temp;
}

int main(int argc, char const *argv[]) {
  person roster[SIZE];
  // number of people in roster:
  int n;
  std::cin >> n;
  for (int i = 0; i < n; i++){
    entry(&roster[i]);
  }
  return 0;
}

在我输入 n 值后程序就结束了。请帮我解决这个问题,非常感谢

【问题讨论】:

  • 除了奇怪的#include "iostream"std::cin,你的代码几乎是C。
  • 如果你是从书本或教程中学习 C++,我建议你把它扔掉,给自己一个better C++ book。代码中有很多 C 主义和不良习惯,这是一本好的 C++ 书籍所没有的。
  • char *name; 你从来没有分配内存来分配给它,相反你应该更喜欢 C++ 中的std::string
  • 请不要那样做。 C 和 C++ 是不同的语言。 非常不同。使用上面发布的链接查找 C++ 书籍。仅仅因为 C 代码碰巧在 C++ 中运行并不意味着您应该 编码。它只会给你带来巨大的痛苦
  • 不要越过溪流,可能很糟糕,非常糟糕。如果您使用std::cin,请不要使用gets。 (不要使用gets,因为它会溢出字符数组。)相反,使用std::stringstd::getline,例如std::getline(std::cin, my_string);

标签: c++ struct


【解决方案1】:

问题是gets(temp.name) 没有为你的字符串分配内存,它期望temp.name 已经指向分配的存储空间。但是,temp.name 从未初始化,充其量您的程序会在尝试读取名称时崩溃,最坏的情况它似乎可以工作,但会覆盖内存,这会导致以后出现问题。即使你为它提供了一个缓冲区,gets() 也不知道你的缓冲区有多大,并且会很高兴地写到缓冲区的末尾,因为它尝试读取的行足够长。 这就是为什么gets() 是一个自 C11 以来已被删除的已弃用函数,而我的编译器甚至不会编译您的代码。

要读入一行,要么使用 POSIX 函数 getline(),它不是标准的 C 或 C++,要么使用 C++ 的 std::getline() 函数。但是,后者要求您读入std::string,而不是char *

最后,正如 Thomas Matthews 在 cmets 中提到的,不要将 C++ 的 I/O 函数与 C I/O 函数混用,所以std::getline() 是要走的路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2019-04-30
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多