scanf读加号带整数但不是减号,乘法或除法

时间:2015-06-14 17:13:26

标签: c

在编写算术表达式简化器时,我只是观察到了这种奇怪的行为。重新创建了以下问题:

#include <stdio.h>

int main(void)
{
    int n, i;
    char s[200];

    for(i=0;i<2;i++){
        if(scanf("%d", &n) == 1)
        {
            printf("%d\n", n);
        } else {
            scanf("%s", s);
            printf("%s\n", s);
        }
    }
    return 0;
}

如果输入为5+10,则会在5中显示n,在10中显示s。但是,对于其他符号5-10,它在5中读取n,在-10中读取s,这是预期的输出。

我的问题是:哪些C功能导致了这个问题?检查:gcc版本4.8.2和ideone。

修改

通过char读取整数来解决char的问题。感谢您的所有时间。 :)

如果有人有兴趣:http://ideone.com/rOPyQD

2 个答案:

答案 0 :(得分:3)

  

如果输入为5 + 10,则读取n为5,s为10。但是,对于其他符号,即5-10,它在n中读取5,在s中读取-10,这是预期的输出。

您错了,因为您可以通过更改printf()语句来确定,以便您可以区分哪一个产生每个输出。然后,您会发现您的程序正在循环的第一次迭代中将5读入n,然后将10-10读入 {{ 1}} ,而不是第二次迭代的n

这是因为s字段描述符读取可选的带符号十进制整数。 &#34;可选择签名&#34;意味着紧接着 %d为负-为正。因此,+"+10"都可以通过"-10"字段进行扫描。

答案 1 :(得分:1)

这两个都在

中阅读
if(scanf("%d", &n) == 1)

在第一种情况下,当您键入5 + 10时,在第一次迭代中,正在读取n,在第二次迭代中,正在读取n中的+10。由于它是正数,+ 10和-10相同,它在printf语句中打印10

printf("%d\n", n);

请注意,这里是你在printf中使用“%d”,而不是“%s”。这里没有调用带有“%s”的printf语句。

这也解释了第二种情况。 -10被读取为'n'并使用“%d”打印