在编写算术表达式简化器时,我只是观察到了这种奇怪的行为。重新创建了以下问题:
#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
答案 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”打印