为何二维数组中的最大字符元素无法从内层循环打印?
问题分析与修正方案
原代码的核心问题
- 未初始化变量引发越界:
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
相关产品推荐
相关产品推荐

