首页 > 解决方案 > 我被 C++ 中的这个结构困住了

问题描述

我目前正在学习 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 值后立即结束。请帮我解决这个问题,非常感谢

标签: c++struct

解决方案


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

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

最后,正如 Thomas Matthews 在评论中提到的那样,不要将 C++ 的 I/O 函数与 CI/O 函数混用,这样std::getline()是要走的路。


推荐阅读