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

使用函数向二维字符数组输入字符串时输出异常求助

问题排查与修复

你的代码核心错误在于对二维数组的赋值逻辑完全错误,导致字符串存储位置混乱,输出出现异常。具体问题和修复方案如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:37:14