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
相关产品推荐
相关产品推荐

