C语言if语句内for循环失效问题:原因排查与解决
C语言矩阵三角转换循环不执行的问题分析与修复
问题核心原因
你的代码里if/else分支内的循环未执行,主要源于两个关键问题:
- 输入缓冲区残留换行符干扰字符读取
前面用scanf("%d")读取行数后,输入缓冲区会残留一个换行符\n。后续的scanf("%c ", &ch)(格式串后带空格)虽能跳过空白,但实际会先读取残留的换行,导致ch未拿到用户输入的'u'或'l',直接跳过if/else分支,循环自然不会运行。 - 数组下标越界引发未定义行为
C语言数组下标从0开始,你代码中循环用i从1到row、j从1到col,访问mat[i][j]时会越界(比如row=3时,合法下标为0、1、2,访问到3就超出数组范围),这会破坏内存中其他变量,可能导致逻辑判断失效等异常。
修复步骤
- 修正字符读取的输入处理
将读取字符的scanf("%c ", &ch)改为scanf(" %c", &ch)(注意%c前加空格,自动跳过所有空白字符,包括换行、空格),也可以在读取字符前调用getchar()清空缓冲区残留的换行。 - 统一数组下标从0开始
所有循环的i和j从0开始,终止条件改为i < row、j < col,同时调整对角线和三角矩阵的判断条件:- 主对角线:
i == j(逻辑不变,下标范围合法) - 副对角线:
i + j == row - 1(原row+1是基于下标1的逻辑,下标0时总和应为row-1) - 上三角矩阵:当
i > j时,将mat[i][j]设为0 - 下三角矩阵:当
i < j时,将mat[i][j]设为0
- 主对角线:
修正后的完整代码
#include <stdio.h> int main() { int row, col, i, j; char ch; printf("Enter the Value of Row or Column: "); scanf("%d", &row); col = row; int mat[row][col]; // 输入矩阵,下标从0开始,显示给用户的坐标保留1起始习惯 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf("enter the value(%d,%d): ", i+1, j+1); scanf("%d", &mat[i][j]); } } // 输出主对角线,优化为直接访问下标 printf("Principle Diagonal is: [ "); for (i = 0; i < row; i++) { printf("%d ", mat[i][i]); } printf("]\n"); // 输出副对角线,直接计算对应下标 printf("General Diagonal is: [ "); for (i = 0; i < row; i++) { j = row - 1 - i; printf("%d ", mat[i][j]); } printf("]\n"); // 读取转换指令,跳过前置空白字符 printf("Type 'u' or 'l' for Upper or Lower Triangular Matrix: "); scanf(" %c", &ch); // 转换为上三角矩阵 if (ch == 'u') { for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (i > j) { mat[i][j] = 0; } } } } // 转换为下三角矩阵 else if (ch == 'l') { for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (i < j) { mat[i][j] = 0; } } } } // 显示转换后的矩阵 printf("Transformed Matrix:\n"); for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf("%d ", mat[i][j]); } printf("\n"); } return 0; }
额外优化了对角线输出逻辑,去掉不必要的内层循环,直接通过下标计算获取元素,提升代码效率。
内容的提问来源于stack exchange,提问作者MJ Saif
相关产品推荐
相关产品推荐

