Scanf被忽略[重复]

Posted

技术标签:

【中文标题】Scanf被忽略[重复]【英文标题】:Scanf is ignored [duplicate] 【发布时间】:2022-01-04 12:58:27 【问题描述】:

我有一个作业,我必须输入第一个矩阵的维度,然后我要执行哪个操作('​​-'、'+' 或 '*';分别是减法、加法和乘法),然后第二个矩阵的维度。但在输入第一个维度后,我收到与 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 之后按下的换行符。在格式字符串中添加一个前导空格:" %c" 以跳过前导空格(如换行符)。

    第二个问题是逻辑条件错误,无论c的输入如何,都会一直是true

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

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

【讨论】:

以上是关于Scanf被忽略[重复]的主要内容,如果未能解决你的问题,请参考以下文章

禁止显示状态 警告 C6031 返回值被忽略: “scanf“.

vs2022scanf函数的使用,使用scanf的报错-返回值被忽略:解决·方法

解决protobuf忽略空返回值的问题

如何检查文件是不是被git忽略[重复]

从 Github 中删除一个被忽略的目录 [重复]

如何使用 sscanf 忽略字段(%* 被拒绝)