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解码错误的核心原因是程序输入处理逻辑存在缺陷,具体如下:
scanf格式符的错误用法:代码中scanf("%d\n", &n)和scanf("%c\n", &a[i][j])里的\n会让scanf持续读取输入,直到遇到非空白字符才停止。当n=50时,矩阵有2500个元素,这种处理会把大量换行符、空格错误读入a数组的字符元素中,甚至可能读取到超出预期的二进制数据。- 字符读取混乱:输入矩阵元素时,
scanf("%c\n", ...)会将用户输入字符后的换行符也当作有效输入处理,导致a[i][j]实际存储的可能是换行符或其他空白字符,而非预期的矩阵元素。当n增大到50时,这类错误积累到一定程度,就会出现不属于UTF-8编码范围的字节(比如0x87),触发解码错误。 - 栈溢出风险: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
相关产品推荐
相关产品推荐

