C语言将结构体传入函数后使用scanf_s为成员赋值出错如何解决
问题根因
你传递结构体指针的逻辑完全正确,报错是**scanf_s函数的使用规范不满足**导致的。scanf_s是C标准可选的安全输入接口,针对%s、%c这类涉及字符缓冲区写入的格式符,强制要求额外传入缓冲区的最大可用长度参数,避免输入溢出。你没有传入这个参数时,函数会非法访问栈内存获取随机值作为长度阈值,直接触发运行时错误。
需要修正的两处代码
- 等待用户按回车的逻辑错误
你写的scanf_s("Press Enter");要求用户必须输入完全匹配Press Enter的字符串才会执行后续逻辑,完全不符合你等待回车的需求,替换为:
// 等待用户输入回车 getchar(); // 如果担心之前有残留换行符可以用下面的写法清空输入缓冲区 // while (getchar() != '\n');
- 名字输入的
scanf_s缺少长度参数
你的name数组长度为20,补充缓冲区长度参数即可:
// 注意第三个参数为缓冲区最大长度,sizeof返回size_t,部分编译器要求转unsigned int避免警告 scanf_s(" %s", u->name, (unsigned int)sizeof(u->name));
修正后完整可运行代码
#include <stdio.h> typedef struct player { char name[20]; int health; } player; void titleScreen(player *u) { printf("Press Enter: \n"); getchar(); printf(" |>>>\r\n" " |\r\n" " _ _|_ _\r\n" " |;|_|;|_|;|\r\n" " \\\\. . /\r\n" " \\\\: . /\r\n" " ||: |\r\n" " ||:. |\r\n" " ||: .|\r\n" " ||: | \\,/\r\n" " ||: , | /`\\\r\n" " ||: |\r\n" " ||: . |\r\n" " __ _||_ |\r\n" " ____--`~ '--~~__ __ ----~ ~`---, ___\r\n" "-~--~ ~---__ ,--~' ~~----_____-~' `~----~~\n"); printf("Name your hero: "); scanf_s(" %s", u->name, (unsigned int)sizeof(u->name)); // 测试输入结果 printf("Hero name: %s, Health: %d\n", u->name, u->health); } int main(int argc, char* argv[]) { player user; //The User player *uPtr; //Pointer to user uPtr = &user; user.health = 100; titleScreen(uPtr); return 0; }
内容的提问来源于stack exchange,提问作者Rrunr
相关产品推荐
相关产品推荐

