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

C语言矩阵程序大尺寸测试用例出现UTF-8解码错误求助

程序功能

该程序用于接收一个矩阵和整数k,将矩阵中除大小为k的左上、右上、左下、右下三角区域外的所有元素替换为星号('*')。

代码
#include <stdio.h>

int main()
{
    int n, x, i, j;
    // Inputs
    printf("n: ");
    scanf("%d\n", &n);
    char a[n][n], b[n][n];
    printf("Enter the matrix elements\n");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("[%d][%d]: ", i, j);
            scanf("%c\n", &a[i][j]);
            b[i][j] = '*';
        }
    }
    printf("x: ");
    scanf("%d\n", &x);
    printf("x: %d\n",x);
    
    // Implementation
    // Top right and left triangles 
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < x - i; j++)
        {
            b[i][j] = a[i][j];
        }
        for (j = n - 1; j >= (n - x) + i; j--)
        {
            b[i][j] = a[i][j];
        }
    }
    
    // Bottom right and left triangles
    int c = 0;
    for (i = n - 1; i >= (n - x); i--)
    {
        for (j = 0; j < x - c; j++)
        {
            b[i][j] = a[i][j];
        }
        for (j = n - 1; j >= (n-x) + c; j--)
        {
            b[i][j] = a[i][j];
        }
        c++;
    }
    
    // Printing the mat
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%c ", b[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}
问题描述

该程序在矩阵大小n为1至8时运行正常,但提交后,矩阵大小n=50的测试用例出现错误:'utf-8' codec can't decode byte 0x87 in position 377: invalid start byte,请问该错误出现的原因是什么?

错误原因分析

这个UTF-8解码错误的核心原因是程序输入处理逻辑存在缺陷,具体如下:

  1. scanf格式符的错误用法:代码中scanf("%d\n", &n)和scanf("%c\n", &a[i][j])里的\n会让scanf持续读取输入,直到遇到非空白字符才停止。当n=50时,矩阵有2500个元素,这种处理会把大量换行符、空格错误读入a数组的字符元素中,甚至可能读取到超出预期的二进制数据。
  2. 字符读取混乱:输入矩阵元素时,scanf("%c\n", ...)会将用户输入字符后的换行符也当作有效输入处理,导致a[i][j]实际存储的可能是换行符或其他空白字符,而非预期的矩阵元素。当n增大到50时,这类错误积累到一定程度,就会出现不属于UTF-8编码范围的字节(比如0x87),触发解码错误。
  3. 栈溢出风险:n=50时,char a[50][50]和char b[50][50]共占用5000字节的栈空间,虽然多数系统栈能容纳,但如果测试环境栈空间较小,可能导致栈损坏,进而产生乱码字节,引发UTF-8解码错误。

对应的修复方案:

  • 移除scanf格式字符串中的\n,改为scanf("%d", &n)、scanf(" %c", &a[i][j])(%c前加空格可自动跳过空白字符)。
  • 对于大数组,建议用malloc动态分配内存替代栈上的变长数组,避免栈溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:55:13