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

为何用指针读取结构体实例时代码抛异常?输入不完整如何解决?

问题分析与修复方案

核心问题定位

  • 格式串中的\n导致输入阻塞
    scanf的格式串里的空白字符(包括\n)会匹配输入中所有连续的空白(空格、换行、制表符),直到读取到非空白字符才会结束当前scanf调用。你在每个scanf的格式串末尾加了\n,导致输入完第一个内容按回车后,程序会一直等待下一个非空白字符,表现为后续输入无法正常获取。

  • scanf_s的参数缺失导致异常
    scanf_s是微软提供的安全输入函数,使用%s读取字符串时,必须额外传入缓冲区的大小作为参数,否则会因参数不完整触发异常。

  • 冗余的取地址符&
    ptr->name是数组名,会自动退化为指向数组首元素的指针(char*类型),而%s需要的就是char*类型的参数,不需要再加&(&ptr->name的类型是char(*)[20],虽部分编译器兼容,但不符合规范)。


修复后的代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

struct Student
{
    char name[20];
    char id[10];
    float GPA;
};

void readStudent(struct Student* ptr) 
{
    printf("Enter name: ");
    // 使用scanf_s时需传入缓冲区大小
    scanf_s("%s", ptr->name, (unsigned)_countof(ptr->name));
    // 若用标准scanf,使用下面一行替代:
    // scanf("%s", ptr->name);

    printf("Enter id: ");
    scanf_s("%s", ptr->id, (unsigned)_countof(ptr->id));
    // 标准scanf替代写法:
    // scanf("%s", ptr->id);

    printf("Enter GPA: ");
    scanf_s("%f", &ptr->GPA);
    // 标准scanf替代写法:
    // scanf("%f", &ptr->GPA);
}

void printStudent(struct Student* ptr)
{
    printf("Name:%s\n", ptr->name);
    printf("ID:%s\n", ptr->id);
    printf("GPA:%f\n", ptr->GPA);
}

int main() 
{
    struct Student student1;
    struct Student* ptr = &student1;
    readStudent(ptr);
    printStudent(ptr);
}

补充说明

  • 若使用标准scanf,只需去掉格式串末尾的\n,并移除数组参数前的&即可正常运行。
  • 使用scanf_s时,字符串输入必须传入缓冲区大小,_countof宏可直接获取数组的元素个数(因char占1字节,等价于缓冲区总字节数)。

内容的提问来源于stack exchange,提问作者thedrooster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:33:32