在编写算术表达式简化器时,我只是观察到了这种奇怪的行为。重新创建了以下问题:
#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
,则在n
中读取5
,在s
中读取10
。但是,对于其他标志,即5-10
,它读5
in n
,-10
in s
,这是预期的输出。
我的问题是:是哪些C特性导致了这一点?查看了: gcc版本4.8.2和ideone。
编辑
通过对整数的字符读取来解决char问题。感谢你的时间。:)
如果有人感兴趣:http://ideone.com/rOPyQD
发布于 2015-06-14 17:29:19
如果输入是5+10,它读取5 in n和10 in s。但是,对于其他符号,即5-10,它读5 in n,-10 in s,这是预期的输出。
您错了,因为您可以通过更改printf()
语句来确定,这样您就可以区分哪个语句生成每个输出。然后,您会发现您的程序是在循环的第一次迭代中将5
读入n
,然后在第二次迭代中将10
或-10
读入n
,而不是s
。
这是因为%d
字段描述符读取可选带符号的十进制整数。“可选签名”的意思是,在前面紧跟-
表示否定,而+
表示肯定。因此,"+10"
和"-10"
都可以通过%d
字段进行扫描。
发布于 2015-06-14 17:35:14
这两本书都在读
if(scanf("%d", &n) == 1)
在第一种情况下,当键入5+10时,第一次迭代5在n中读取,在第二次迭代+10在n中读取。
printf("%d\n", n);
请注意,在printf中使用的是"%d“,而不是"%s”。这里没有调用带有"%s“的printf语句。
这也解释了第二个案件。-10正在读入“n”,并使用"%d“打印。
https://stackoverflow.com/questions/30832254
复制相似问题