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

C语言实现动态char矩阵时输入读取不全问题该如何解决?

问题根因

你的char版本代码无法正常读取的核心原因是输入缓冲区残留的换行符被%c读取:

  • 前面调用scanf("%d", &r)和scanf("%d", &c)读取行数、列数时,输入数字后按下的回车键(换行符\n)会留在输入缓冲区里
  • %d格式符默认会跳过开头的空白字符(空格、换行、制表符等),所以int版本的代码不会受影响;但%c不会跳过任何空白字符,会直接把残留的换行符当成有效字符读取,导致实际要输入的字符额度被提前占用,看起来就像程序提前停止了输入。

解决方法

在读取完列数之后、开始循环读取字符之前,先清空输入缓冲区的残留换行;如果需求是只读取可见字符、跳过输入中的空白/换行,也可以给%c前面加空格,让scanf自动跳过所有前置空白字符。

修正后的完整代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int r , c  ;
    int i;
    char *ptr,b;

    printf("ROWS ");
    scanf("%d",&r);
    printf("COLS ");
    scanf("%d",&c);
    ptr = (char *)malloc((r * c) * sizeof(char));
    // 清空输入缓冲区残留的换行
    while(getchar() != '\n');

    for (i = 0; i < r * c; i++)
    {
        // %c前加空格,跳过每次输入前的空白字符,也可按需去掉空格保留读取所有字符的能力
        scanf(" %c",&b);
        ptr[i] = b;

    }
    for (i = 0; i < r * c; i++)
    {
        printf("%c ", ptr[i]);
        if ((i + 1) % c == 0)
        {
            printf("\n");
        }
    }
    // 释放malloc申请的内存,避免内存泄漏
    free(ptr);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:06:07