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

如何用用户输入的多字符串填充数组?含代码问题及后续需求

字符串数组实现错误及修正方案

你的代码核心问题出在字符串数组的定义和使用上,导致无法正确存储多个字符串,具体问题如下:

  • 数组类型错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:25:56