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

为何二维数组中的最大字符元素无法从内层循环打印?

问题分析与修正方案

原代码的核心问题

  • 未初始化变量引发越界:char j;未初始化就用作数组下标,wordinput[i][j]会访问随机内存地址,直接导致段错误。
  • scanf使用错误:用%c读取字符串完全不符合需求,且未传递指针(wordinput[i][j]是字符值而非地址),应该用%s读取字符串,参数传wordinput[i]。
  • 循环逻辑混乱:外层for和内层while同时递增i,导致循环流程失控,且外层循环末尾直接break,仅执行一次就退出。
  • 功能逻辑缺失:既没有计算字符串长度来找出最长项,也没有实现回文判断逻辑,当前内层for循环完全是无效操作。
  • 变量重定义冲突:内层for循环重新定义int j,与函数内的char j冲突,加剧逻辑混乱。

修正后的代码

实现读取5个字符串、找出最长项并判断是否为回文的功能:

#include<stdio.h>
#include<string.h>
#define ROWS 5
#define LENGTH 1024

int main(void)
{
    char wordinput[ROWS][LENGTH];
    int lengths[ROWS]; // 存储每个字符串的长度
    int max_len = 0;
    int max_index = 0;

    // 读取输入并记录每个字符串的长度
    for(int i = 0; i < ROWS; i++) 
    {
        printf("Word %d: ", i + 1);
        scanf("%s", wordinput[i]);
        lengths[i] = strlen(wordinput[i]);
        
        // 更新最长字符串的信息
        if(lengths[i] > max_len)
        {
            max_len = lengths[i];
            max_index = i;
        }
    }

    // 判断最长字符串是否为回文
    int is_palindrome = 1;
    char *max_word = wordinput[max_index];
    int len = strlen(max_word);
    for(int k = 0; k < len / 2; k++)
    {
        if(max_word[k] != max_word[len - 1 - k])
        {
            is_palindrome = 0;
            break;
        }
    }

    // 输出结果
    printf("Input \"%s\" is the largest", max_word);
    if(is_palindrome)
    {
        printf(", and IT IS a palindrome!\n");
    }
    else
    {
        printf(", but it is NOT a palindrome.\n");
    }

    return 0;
}

关键修正说明

  • 用strlen获取每个字符串长度,通过遍历比较找出最长字符串的索引。
  • 回文判断逻辑:从字符串两端向中间对比字符,只要有一对不相等则判定为非回文。
  • 修正scanf使用:用%s读取字符串,直接传递wordinput[i](二维数组行首地址),自动跳过空白符(包括换行)。
  • 移除混乱嵌套循环,改用清晰线性流程:读取输入→找最长项→判断回文→输出结果。
  • 所有变量均正确初始化,避免未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:10:54