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

C语言二维字符串数组输入后无法正常输出:问题排查与修复

问题分析与修复方案

首先,你的代码存在两个核心错误,都是因为对二维char数组的结构和scanf/printf格式符的用法理解有误:


错误1:scanf("%s", &col[i][j]) 参数错误

char col[100][100] 定义的是100个长度为100的字符串数组——也就是说,col[i]本身就是一个可以存储字符串的char数组(等价于char*类型,指向第i个字符串的首地址)。

而你写的&col[i][j]是单个char的地址,当用%s格式符读取字符串时,scanf会从这个地址开始连续写入字符直到遇到空白符,这会直接越界覆盖后续内存(包括其他行的数组内容),导致内存混乱。

错误2:printf("%s\t", col[i][j]) 格式符不匹配

col[i][j]是一个单个char类型的值,但%s格式符要求传入的是char*类型的指针(字符串的首地址)。把char值当作指针使用会导致程序访问非法内存,出现乱码、崩溃等未定义行为。


接下来根据你的需求给出两种修复方案:

方案1:如果你想输入4个独立的字符串(2行2列排列)

我们可以用三维数组来明确区分行和列的字符串,这样col[i][j]就是第i行第j列的字符串:

#include <stdio.h>
#include<string.h>
int main()
{
    char col[2][2][100]; // 2行2列,每个位置存一个最多99字符的字符串
    int i,j;
    for(i=0; i<2; i++)
    {
        for(j=0; j<2; j++)
        {
            scanf("%s", col[i][j]); // col[i][j]直接作为字符串首地址
        }
    }
     for(i=0; i<2; i++)
    {
        for(j=0; j<2; j++)
        {
           printf("%s\t", col[i][j]);
        }
        printf("\n");
    }

    return 0;
}

方案2:如果你想输入的是2x2的字符网格(每个位置是单个字符)

这种情况应该用%c格式符读取和打印单个字符,注意要跳过输入时的换行、空格等空白符(在scanf前加空格即可):

#include <stdio.h>
#include<string.h>
int main()
{
    char col[100][100];
    int i,j;
    for(i=0; i<2; i++)
    {
        for(j=0; j<2; j++)
        {
            // 加空格跳过输入时的空白符,避免读取到换行
            scanf(" %c", &col[i][j]);
        }
    }
     for(i=0; i<2; i++)
    {
        for(j=0; j<2; j++)
        {
           printf("%c\t", col[i][j]); // 用%c打印单个字符
        }
        printf("\n");
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:16:29