使用函数向二维字符数组输入字符串时输出异常求助
问题排查与修复
你的代码核心错误在于对二维数组的赋值逻辑完全错误,导致字符串存储位置混乱,输出出现异常。具体问题和修复方案如下:
1. 全局累计的i变量导致存储位置错乱
你在input函数中定义的i是整个函数的全局变量,会累计所有输入的字符总数。这意味着:
- 第一行字符串
water会存在str[0][0]到str[0][4],然后i变成5; - 第二行
newwater会被写到str[1][5]到str[1][12],而str[1][0]到str[1][4]是未初始化的垃圾值; - 输出
str[1]时,会先输出这些垃圾值(比如你看到的@),再输出newwater,最终呈现出混乱的结果。
2. 未限制每行的最大输入长度
参数n的意图应该是限制每行字符串的最大长度,但你的代码逻辑是累计所有字符不超过n,完全不符合需求。而且没有处理输入字符数超过n-1的情况(需要留一个位置给字符串结束符'\0')。
修复后的代码
#include <stdio.h> int input(char str[5][100], int max_len) { int ch, i, j; for (j = 0; j < 5; j++) { i = 0; // 每行开始时重置i,从当前行的第0个位置开始存储 while ((ch = getchar()) != '\n' && ch != EOF) // 增加EOF判断,处理输入结束的情况 { if (i < max_len - 1) // 留一个位置给'\0' { str[j][i++] = ch; } // 如果超过max_len-1,直接丢弃多余字符 } str[j][i] = '\0'; // 给当前行添加字符串结束符 } return j; // 返回实际输入的行数,这里固定是5,可根据需求调整 } int main() { char str[5][100]; int lines = input(str, 10); // max_len设为10,每行最多存9个字符+1个'\0' for (int i = 0; i < lines; i++) { printf("%s\n", str[i]); // 每行输出后换行,更清晰 } return 0; }
修复说明
- 把
i的定义放到for (j...)循环内部,每行开始时重置为0,确保每个字符串都从当前行的起始位置存储; - 修改
max_len的使用逻辑:每行最多存储max_len-1个字符,预留位置给'\0'; - 增加
EOF判断,避免输入异常时陷入死循环; - 输出时添加换行符,让每行字符串单独显示,更易读。
用你提供的输入测试,修复后的代码会正常输出:
water newwater camouflag norwaya poliski
内容的提问来源于stack exchange,提问作者Valmax
相关产品推荐
相关产品推荐

