2015-06-14 40 views
2

在编写算术表达式简化器时,我只是观察到这种奇怪的行为。重建是以下问题:scanf读取加整数但不是减号,乘法或除法符号

#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它读取n5s10。但是,对于其他标志,即5-10,其在5中的n-10s中是预期的输出。

我的问题是:哪些C功能造成这种情况?检查:gcc版本4.8.2和ideone。

编辑


的整数字符阅读解决了焦炭的问题。谢谢你的时间。 :)

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

+0

查看[scanf](http://linux.die.net/man/3/scanf)手册页,特别是格式字符串解释。 – Jens

+0

@Jens也许我不够好找到我的答案。阅读之前和现在。 :( – silentboy

+0

@ user3121023亲爱的先生,这个程序只需要两个输入,要么5 + 10或5-10。没有理由没有什么会在s中扫描 – silentboy

回答

3

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

你错了,你可以通过改变你的printf()声明来确定,以便区分哪一个产生每个输出。然后你会发现,你的程序读取5n在循环的第一次迭代,然后阅读或者10-10n,不s第二迭代。

发生这种情况是因为%d字段描述符读取一个可选的十进制整数。 “任选签名”表示紧接在之前,或者 a -用于负数或者+用于正数。因此,可以通过%d字段扫描"+10""-10"

+0

道歉。 – silentboy

1

这里既有正被在

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

读出。在第一种情况下,当键入5 + 10,在第一次迭代5在n和在第二次迭代10读取正被读取在正。既然是积极的,+10和-10是一样的,它打印10 printf语句

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

而且这里要注意的是,你在printf的,而不是“%s”使用“%d”。带有“%s”的printf语句在此处未被调用。

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