如何用用户输入的多字符串填充数组?含代码问题及后续需求
字符串数组实现错误及修正方案
你的代码核心问题出在字符串数组的定义和使用上,导致无法正确存储多个字符串,具体问题如下:
- 数组类型错误:
char strings_array[n];是一维字符数组,只能存放n个单个字符,根本没法存储n个独立的字符串。要存多个字符串,得用二维字符数组(固定每个字符串的最大长度)或者字符指针数组(动态分配内存,更灵活)。 - 输入地址错误:
scanf("%s", &strings_array[i]);传入的是单个字符的地址,当你输入字符串时,会直接越界覆盖后续内存,导致存储的数据混乱,打印自然不符合预期。
修正方案1:使用二维字符数组(固定单字符串最大长度)
这种方式适合提前知道输入字符串的最大长度的场景,比如限制每个字符串最多100个字符:
#include <stdio.h> #include <string.h> #define MAX_STR_LEN 100 // 定义单个字符串的最大长度 int main() { int n; puts("请输入要录入的字符串数量:"); scanf("%d", &n); // 定义二维字符数组:n个字符串,每个最多存MAX_STR_LEN个字符(含结束符'\0') char strings_array[n][MAX_STR_LEN]; // 清除scanf后的换行符,避免影响后续输入 getchar(); // 录入字符串 for (int i = 0; i < n; i++) { printf("请输入第%d个字符串:", i+1); fgets(strings_array[i], MAX_STR_LEN, stdin); // 去掉fgets读取的换行符(如果存在) size_t len = strlen(strings_array[i]); if (len > 0 && strings_array[i][len-1] == '\n') { strings_array[i][len-1] = '\0'; } } // 打印测试 puts("\n你输入的字符串是:"); for (int j = 0; j < n; j++) { printf("%s\n", strings_array[j]); } // 找出最长字符串并反向输出 int max_len = -1; int max_index = 0; for (int k = 0; k < n; k++) { int len = strlen(strings_array[k]); if (len > max_len) { max_len = len; max_index = k; } } puts("\n最长字符串是:"); printf("%s\n", strings_array[max_index]); puts("反向输出结果:"); for (int m = max_len - 1; m >= 0; m--) { printf("%c", strings_array[max_index][m]); } printf("\n"); return 0; }
修正方案2:使用字符指针数组+动态分配内存(更灵活)
这种方式不需要提前限制字符串长度,会根据输入的实际长度分配内存:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int n; puts("请输入要录入的字符串数量:"); scanf("%d", &n); // 定义字符指针数组,每个指针指向一个字符串 char *strings_array[n]; getchar(); // 清除换行符 // 录入字符串并动态分配内存 for (int i = 0; i < n; i++) { printf("请输入第%d个字符串:", i+1); // 用临时缓冲区读取字符串 char temp[1024]; fgets(temp, sizeof(temp), stdin); size_t len = strlen(temp); if (len > 0 && temp[len-1] == '\n') { temp[len-1] = '\0'; len--; } // 分配对应长度的内存 strings_array[i] = (char*)malloc((len + 1) * sizeof(char)); if (strings_array[i] == NULL) { puts("内存分配失败!"); return 1; } strcpy(strings_array[i], temp); } // 打印测试 puts("\n你输入的字符串是:"); for (int j = 0; j < n; j++) { printf("%s\n", strings_array[j]); } // 找出最长字符串并反向输出 int max_len = -1; int max_index = 0; for (int k = 0; k < n; k++) { int len = strlen(strings_array[k]); if (len > max_len) { max_len = len; max_index = k; } } puts("\n最长字符串是:"); printf("%s\n", strings_array[max_index]); puts("反向输出结果:"); for (int m = max_len - 1; m >= 0; m--) { printf("%c", strings_array[max_index][m]); } printf("\n"); // 释放动态分配的内存 for (int p = 0; p < n; p++) { free(strings_array[p]); } return 0; }
内容的提问来源于stack exchange,提问作者Mani Aghaie
相关产品推荐
相关产品推荐

