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

C语言scanf读取矩阵运算操作符报错,输入首维度后字符校验失败

问题根因及修复方案

你的代码存在两个核心错误,分别是输入缓冲区空白符残留、运算符校验逻辑错误:

  • 错误1:%c格式符默认不跳过空白符
    第一个scanf("%d %d", &rows_1, &columns_1)执行完成后,你输入完两个维度按下的换行符会残留在输入缓冲区中。接下来执行scanf("%c", &c)时,会直接把这个换行符读取到变量c中,导致后续运算符校验直接失败。
    修复方法:将读取运算符的代码改为scanf(" %c", &c),格式字符串开头的空格会指示scanf自动跳过所有前置空白字符(换行、空格、制表符等),只读取第一个有效非空白字符。
  • 错误2:运算符校验逻辑运算符使用错误
    你当前使用||(逻辑或)做判断,该逻辑下任意输入都会触发报错:比如c为合法的+时,c!='*'条件成立,逻辑或只要有一个条件成立整体就为真,直接进入报错分支。
    修复方法:将||替换为&&(逻辑与),仅当c同时不等于三个合法运算符时才触发报错。
修复后可运行代码
int main(void){
    int rows_1 = 0, columns_1 = 0;                  //MATRIX_1 DIM
    int rows_2 = 0, columns_2 = 0;                  //MATRIX_2 DIM
    char c = ' ';
    
    if(scanf("%d %d", &rows_1, &columns_1)!=2)       //input first size
    {
        fprintf(stderr, "Error!\n");
        return 100;
    }

    scanf(" %c", &c); // 此处加空格跳过前置空白符
    
    if( c!='*' && c!='-' && c!='+' )                // 替换||为&&
    {
        fprintf(stderr, "Error!\n");
        return 100;  
    }
    
    if(scanf("%d %d", &rows_2, &columns_2)!=2)       //input second size
    {
        fprintf(stderr, "Error!\n");
        return 100;
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:15:01