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

如何将用户输入字符串存入指针数组?修复代码仅存最后一项的问题

问题原因

你遇到的问题本质是所有指针都指向了同一块内存区域:

  • char *names[4]是指针数组,每个元素仅存储一个内存地址;
  • name[10]是单个固定大小的字符数组,每次输入都会覆盖它的内容;
  • 循环中names[i] = name只是把name数组的首地址赋值给每个指针,最终所有指针都指向name,自然输出的都是最后一次输入的字符串。
两种修改方案

方案1:为每个指针分配独立内存(灵活可控)

通过malloc为每个指针单独分配内存,再用strcpy把输入的字符串复制到新内存中,需要包含stdlib.h头文件:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char *names[4];
    char name[10];

    for (int i = 0; i < 4; i++) {
        printf("Enter your name: ");
        scanf("%s", name);
        // 分配刚好足够的内存(字符串长度 + 1 用于存储终止符'\0')
        names[i] = malloc(strlen(name) + 1);
        // 检查内存分配是否成功(避免程序崩溃)
        if (names[i] == NULL) {
            printf("Memory allocation failed!\n");
            return 1;
        }
        // 将输入的字符串复制到新分配的内存中
        strcpy(names[i], name);
    }

    for (int i = 0; i < 4; i++)
        printf("\n* %s", names[i]);

    // 释放分配的内存(好习惯,避免内存泄漏)
    for (int i = 0; i < 4; i++) {
        free(names[i]);
    }

    return 0;
}

方案2:使用二维字符数组(简单直接)

直接定义二维字符数组,每个元素是独立的字符数组,无需手动管理内存:

#include <stdio.h>
#include <string.h>

int main()
{
    // 4个元素,每个元素最多存储9个字符 + 1个终止符
    char names[4][10];

    for (int i = 0; i < 4; i++) {
        printf("Enter your name: ");
        // 直接将输入读入对应的数组元素
        scanf("%s", names[i]);
    }

    for (int i = 0; i < 4; i++)
        printf("\n* %s", names[i]);

    return 0;
}
额外注意

原代码中的void main()不符合C语言标准,标准写法应为int main()并返回0(或用return 0;结束程序)。

内容的提问来源于stack exchange,提问作者CrazieGeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:20:23