scanf 被忽略

Scanf is ignored

我有一个作业,其中我必须输入第一个矩阵的维度,然后我想执行哪个操作('​​-'、'+'或'*';分别为减法、加法和乘法),然后是第二个矩阵的维度。但在进入第一维后,我收到与 char 有关的错误消息。即使在阅读了很多与 scanf 相关的空格和错误之后,我也无法弄清楚。请帮忙。谢谢

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!='+' )                //error handling for char
    {
        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;
}

你有两个个问题:

  1. 首先是 c 将包含您在输入 rows_1columns_1 之后按下的 换行符 .在格式字符串中添加单个前导 space:" %c" 以跳过前导白色-space(如换行符)。

  2. 第二个问题是逻辑条件错误,无论c.

    的输入如何,总是true

    您可能需要 c=='*' || c=='-' || c=='+' 的反义词,根据 De Morgan's lawsc!='*' && c!='-' && c!='+'(但您也可以使用逻辑否定运算符 !,如 !(c=='*' || c=='-' || c=='+')).

    如果你稍微想一想,这是很容易理解的。假设 c 是换行符 '\n'。那么 c!='*'true 并且由于逻辑运算符的 short-circuit evaluation ,其余条件将不会被评估。任何其他字符都会发生同样的情况,包括您检查的字符(将换行符换成例如 '-'c!='*' 仍然是正确的;也可以尝试使用 '*' 然后 c!='*' 将为假,但 c!='-' 将为真)。