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_1
和columns_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“.