如何将用户输入字符串存入指针数组?修复代码仅存最后一项的问题
问题原因
你遇到的问题本质是所有指针都指向了同一块内存区域:
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
相关产品推荐
相关产品推荐

