c++ - 我被 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 值后立即结束。请帮我解决这个问题,非常感谢
解决方案
问题是它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()
是要走的路。
推荐阅读
- firebase - 如何将照片保存到 Firebase 存储并将 URL 链接发送到云 Firestore?
- java - java - 迭代列表的最快方法
- visual-studio-2017 - Visual Studio 2017 v15.7.2 关于 Light 主题的 Code Lens 问题
- css - 样式复选框不显示检查 - 与另一个类
- android - 带有布局文件的自定义 ViewGroup
- maven - 无法使用 maven 运行多个 testng xml 文件
- sql - Oracle查询查找最近1个月休假次数最多的员工
- python - 熊猫 x-ticks 情节不起作用
- asp.net-mvc - 修改 bootstrap.min.css 和 bootstrap.min.css.map
- python - Python:实例的返回值