如何使用getchar()将字符串字面量地址存入结构体char*类型成员
需求实现方案
本次需求为限制最大输入7个字符作为姓名,根据实际输入长度动态分配内存存储到结构体的char*成员中,避免固定数组的内存浪费。
原有代码存在的问题
scanf读取年龄后输入缓冲区残留换行符,直接调用getchar会先读到该换行,导致姓名输入逻辑异常- 原代码用
if判断读取字符逻辑错误,需要用循环逐字符读取输入 - 缺少动态内存分配、字符串结束符补全逻辑
完整补全代码
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct id { int age; char* name; }id; int main(void) { id Mary; char L; int c = 0; // 临时缓冲区:最多存7个有效字符 + 1位字符串结束符 char temp_buf[8] = {0}; printf("Enter your age: "); scanf("%d", &Mary.age); // 清空scanf读取年龄后残留的换行符 while(getchar() != '\n'); printf("Enter your name: "); // 逐字符读取,最多读7个有效字符,遇到换行终止输入 while (c < 7 && (L = getchar()) != '\n') { temp_buf[c++] = L; } // 若输入字符超过7个,清空剩余的输入内容,避免影响后续逻辑 if (c == 7) { while(getchar() != '\n'); } // 申请刚好匹配输入长度的内存,无空间浪费 Mary.name = (char*)malloc(sizeof(char) * (c + 1)); // 拷贝输入内容到动态申请的内存中 strcpy(Mary.name, temp_buf); printf("Name: %s\n", Mary.name); // 使用完成后释放动态申请的内存,避免内存泄漏 free(Mary.name); Mary.name = NULL; return 0; }
关键逻辑说明
- 临时缓冲区仅作为读取中转使用,最终存储姓名的内存是按照实际输入长度申请的,完全避免固定数组的空间浪费问题
- 严格限制最多读取7个有效字符,超出部分会被自动丢弃,符合长度限制要求
- 最终
Mary.name存储的就是输入字符串的地址,完全匹配需求
提示:生产环境使用时建议增加
malloc返回值的判空逻辑,处理内存申请失败的异常场景,避免空指针访问风险。
内容的提问来源于stack exchange,提问作者MrFeli45
相关产品推荐
相关产品推荐

