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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:57:03