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

C语言if语句内for循环失效问题:原因排查与解决

C语言矩阵三角转换循环不执行的问题分析与修复

问题核心原因

你的代码里if/else分支内的循环未执行,主要源于两个关键问题:

  1. 输入缓冲区残留换行符干扰字符读取
    前面用scanf("%d")读取行数后,输入缓冲区会残留一个换行符\n。后续的scanf("%c ", &ch)(格式串后带空格)虽能跳过空白,但实际会先读取残留的换行,导致ch未拿到用户输入的'u'或'l',直接跳过if/else分支,循环自然不会运行。
  2. 数组下标越界引发未定义行为
    C语言数组下标从0开始,你代码中循环用i从1到row、j从1到col,访问mat[i][j]时会越界(比如row=3时,合法下标为0、1、2,访问到3就超出数组范围),这会破坏内存中其他变量,可能导致逻辑判断失效等异常。

修复步骤

  1. 修正字符读取的输入处理
    将读取字符的scanf("%c ", &ch)改为scanf(" %c", &ch)(注意%c前加空格,自动跳过所有空白字符,包括换行、空格),也可以在读取字符前调用getchar()清空缓冲区残留的换行。
  2. 统一数组下标从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 12:48:16