You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言将结构体传入函数后使用scanf_s为成员赋值出错如何解决

问题根因

你传递结构体指针的逻辑完全正确,报错是**scanf_s函数的使用规范不满足**导致的。
scanf_s是C标准可选的安全输入接口,针对%s、%c这类涉及字符缓冲区写入的格式符,强制要求额外传入缓冲区的最大可用长度参数,避免输入溢出。你没有传入这个参数时,函数会非法访问栈内存获取随机值作为长度阈值,直接触发运行时错误。


需要修正的两处代码

  1. 等待用户按回车的逻辑错误
    你写的scanf_s("Press Enter");要求用户必须输入完全匹配Press Enter的字符串才会执行后续逻辑,完全不符合你等待回车的需求,替换为:
// 等待用户输入回车
getchar();
// 如果担心之前有残留换行符可以用下面的写法清空输入缓冲区
// while (getchar() != '\n');
  1. 名字输入的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:57:03