C语言家庭人员结构体程序问题:录入母亲姓名环节被跳过
解决C语言录入家庭成员时跳过姓名输入的问题
嘿,我之前写类似程序的时候也踩过这个坑!十有八九是输入缓冲区里残留的换行符在搞鬼,咱们来一步步搞定它:
问题根源
你应该是先用scanf("%d", &id)这类格式读取了数字ID,输入完ID后按下的回车(也就是\n字符)会留在输入缓冲区里。当程序接下来要读取姓名时,scanf("%s", name)会把这个残留的换行符当成有效的输入,直接跳过了让你手动输入姓名的步骤。
快速解决方案
给读取姓名的scanf格式串前面加个空格就行!这个空格会告诉scanf自动跳过所有空白字符(包括换行、空格、制表符),完美避开缓冲区残留的问题。结合你的动态内存分配需求,修正后的核心代码大概是这样:
#include <stdio.h> #include <stdlib.h> #define MAX_NAME 50 typedef struct { char* name; int id; } Person; typedef struct { Person dad; Person mom; Person kid; } Family; int main() { Family myFamily; // 处理父亲信息 myFamily.dad.name = (char*)malloc(MAX_NAME * sizeof(char)); printf("输入父亲姓名:"); scanf(" %s", myFamily.dad.name); // 注意前面的空格 printf("输入父亲ID:"); scanf("%d", &myFamily.dad.id); // 处理母亲信息(现在不会跳过姓名了) myFamily.mom.name = (char*)malloc(MAX_NAME * sizeof(char)); printf("输入母亲姓名:"); scanf(" %s", myFamily.mom.name); // 同样加空格 printf("输入母亲ID:"); scanf("%d", &myFamily.mom.id); // 处理孩子信息 myFamily.kid.name = (char*)malloc(MAX_NAME * sizeof(char)); printf("输入孩子姓名:"); scanf(" %s", myFamily.kid.name); printf("输入孩子ID:"); scanf("%d", &myFamily.kid.id); // 打印信息 printf("\n家庭成员信息:\n"); printf("父亲:%s,ID:%d\n", myFamily.dad.name, myFamily.dad.id); printf("母亲:%s,ID:%d\n", myFamily.mom.name, myFamily.mom.id); printf("孩子:%s,ID:%d\n", myFamily.kid.name, myFamily.kid.id); // 记得释放动态分配的内存! free(myFamily.dad.name); free(myFamily.mom.name); free(myFamily.kid.name); return 0; }
进阶优化(支持带空格的姓名)
如果需要支持像“Mary Ann”这种带空格的姓名,%s就不够用了,改用fgets会更合适,但也要处理缓冲区的残留和fgets自带的换行符:
// 读取姓名前先清空缓冲区 while(getchar() != '\n'); printf("输入母亲姓名:"); fgets(myFamily.mom.name, MAX_NAME, stdin); // 去掉fgets读取到的换行符 myFamily.mom.name[strcspn(myFamily.mom.name, "\n")] = '\0';
额外注意点
- 动态分配内存后一定要检查
malloc的返回值,避免空指针错误; - 程序结束前务必释放所有动态分配的内存,防止内存泄漏;
- 如果你的循环录入成员,逻辑也是一样的,每次读取姓名前处理好缓冲区就行。
内容的提问来源于stack exchange,提问作者Cocoboom
相关产品推荐
相关产品推荐

