为何用指针读取结构体实例时代码抛异常?输入不完整如何解决?
问题分析与修复方案
核心问题定位
格式串中的
\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
相关产品推荐
相关产品推荐

