C语言年龄性别录入程序输出与输入不匹配问题排查
问题根因
- 核心错误为性别输入的格式符误用:你定义的
g是char类型变量,但使用了%s格式符调用scanf读取输入。%s是字符串专用格式符,读取内容后会自动在内存末尾追加\0作为字符串结束标记,char类型仅占1字节存储空间,额外写入的\0触发栈越界,恰好覆盖了相邻存储的int类型变量a的低地址字节,直接导致输入的年龄被意外修改为0。 - 次要逻辑错误为年龄校验位置错位:当前代码是在完成年龄、性别两次输入之后才判断年龄是否小于0,若年龄非法跳回重输年龄,会出现性别已输入但年龄重新录入的逻辑冲突,且首次输入年龄合法时while循环不会生效,校验逻辑没有意义。
修复方案
- 将性别读取的
scanf("%s", &g)改为scanf("%c", &g),匹配char类型的输入规则,避免内存越界。 - 将年龄校验逻辑移到年龄输入、读取缓冲区换行之后,性别输入流程之前,保证只有年龄合法才会进入性别录入环节。
修复后可正常运行的代码如下:
#include<stdio.h> int main(){ int a; char g; entry: printf("%s","AGE : "); scanf("%d", &a); getchar(); // 年龄校验移至性别输入前 if (a < 0){ goto entry; } insert: printf("%s","GENDER :"); scanf("%c", &g); getchar(); switch(g){ case 'M': printf("I am a %d yr old male", a); break; case 'F': printf("I am a %d yr old female", a); break; default: goto insert; break; } return 0; }
内容的提问来源于stack exchange,提问作者Ronald Hirsch
相关产品推荐
相关产品推荐

