Scanf() 在特定情况下表现得很奇怪

Scanf() behaving odd for specific case

提问人:Roemerdt 提问时间:9/27/2018 最后编辑:Roemerdt 更新时间:9/27/2018 访问量:77

问:

我有一些 C 代码,它接受 6 种不同格式的简单方程式(没有空格)。

x + int = int
x - int = int
int + x = int
int - x = int
int + int = x
int - int = x

我正在使用 scanf 提取方程式中的数字,这适用于前 4 种情况,但不适用于后 2 种情况。我不知道为什么。

例如。对于前 2 种格式,我使用这个:

int digit1, digit2;
char operand;
if(scanf("x%c%d=%d", &operand, &digit1, &digit2) == 3) {
    if(operand == '+') {
        printf("x=%d", (digit2-digit1));
        exit(0);
    } else {
        printf("x=%d", (digit2+digit1));
        exit(0);
    }
}

这很有效。

对于最后两种格式,我使用以下(非常相似)代码:

int digit1, digit2;
char operand;
if(scanf("%d%c%d=x", &digit1, &operand, &digit2) == 3) {
    if(operand == '+') {
        printf("x=%d", (digit1+digit2));
        exit(0);
    } else {
        printf("x=%d", (digit1-digit2));
        exit(0);
    }
}

由于某种原因,这无法按预期工作。

我尝试了一些不同的东西,我发现scanf()跳过了第一个数字和数学运算符。这导致 if 语句不成立,因为现在 scanf() 只返回 2,因为它将 digit1 设置为第二位数字,将操作数设置为“=”符号,然后找不到更多的数字。

我的问题是为什么scanf()没有“看到”第一个数字。

对于此示例输入

10+12=x

当前行为:

digit1 = 12
operand = '='
digit2 = 0

期望的行为:

digit1 = 10
operand = '+'
digit2 = 12
C 扫描相

评论

0赞 Jacek Cz 9/27/2018
请完整代码 - 带有变量声明
1赞 Alex G 9/27/2018
您的代码在每种情况下都是正确的。检查如何组合它们。
1赞 n. m. could be an AI 9/27/2018
请发布一个最小的可重现示例
1赞 Jonathan Leffler 9/27/2018
转换规范不会跳过前导空格; 而大多数其他(除扫描集和 )外,其他大多数都跳过前导空格。您应该在格式中添加适当的空格,以允许在输入中使用相应的零或多空格。不要在格式中使用尾随空格。还有你的节目%c%d%[…]%nscanf()12+13
1赞 Jonathan Leffler 9/27/2018
我认为你会更好地阅读字符行(fgets()或POSIX getline()),然后使用(可能在几次尝试中)来解析字符串。这使您可以打印输入行,并更连贯地报告错误,并且通常使基于行的输入更轻松。sscanf()

答:

0赞 Roemerdt 9/27/2018 #1

由于我在第 3 和第 4 种情况下的代码,我的代码被破坏了。

我通过组合案例 3、4、5 和 6 的代码来修复它。

if(scanf("%d%c", &digit1, &operator) == 2) {
    if(scanf("%d=x", &digit2) == 1) {
        if(operator == '+') {
            printf("x=%d", (digit1+digit2));
            exit(0);
        } else {
            printf("x=%d", (digit1-digit2));
            exit(0);
        }
    } else if(scanf("x=%d", &digit2) == 1) {
        if(operator == '+') {
            printf("x=%d", (digit2-digit1));
            exit(0);
        } else {
            printf("x=%d", (digit1-digit2));
            exit(0);
        }
    }
}