我有这段代码片段,可以将算术表达式读取1 + 2 * 3
为整数和字符:
int main() {
int d, flag = 0;
char c;
while ((flag = scanf("%d", &d)) != EOF)
{
if (flag == 1) // if integer was read sucessfully
{
// an integer has been read into variable 'd'
printf("%d,", d);
}
else // else if it was a character
{
// then read char into variable 'c'
c = getchar();
printf("%c,", c);
}
}
}
现在,当与MingGW在Windows和MacOS编译,但不知何故在Linux上,它的字符此代码的工作+
,并-
没有被正确读取。
样品运行:
输入:1 * 2 * 3
输出:1,*,2,*,3,
输入:1 + 2 - 3
输出:1, ,2, ,3,
输入:1 ++ 2 -- 3
输出:1,+,2,-,3
+
和-
字符以某种方式读作空格。但是,如果我们加倍++
和加倍则可行--
。同样,只有在Linux和几乎所有在线IDE上进行编译时,才会发生这种情况。令人费解的是为什么只有+
and-
字符?是否可以将它们识别为正号和负号?
当您输入
1 + 2
扫描第一个数字。当scanf
尝试扫描第二个数字时,它以扫描开始+
(这是一元+的数字的有效开头),但是在+
偶然发现[space]
:failure之后
[space]
+
即使扫描失败,它也不会被使用。这就解释了为什么单独使用+
和-
字符却没有看到它们的原因。
随着*
,*
没有被消耗,因为一些无法通过启动*
您在MinGW上有所不同的事实对我来说是个谜,我在MinGW上却得到了您所描述的“错误”行为。但我的假设是,标准库,你正在使用比标准实现“聪明”,并提出背+
或-
当它找到它,所以可以适当地阅读getchar
之后。
我建议您尝试使用-D__USE_MINGW_ANSI_STDIO=1
来编译代码,以确保gcc
不使用Microsoftscanf
实施,并且您应该再次获得“笨拙”的行为(我不确定是否存在用于解析底数BTW的标准)
您的scanf
方法的确注定要失败,因为:
1 +2
(没有空格),那么该符号也不会被读取,因为它是第二个数字的一部分。最好的方法是使用自定义词法分析器,逐个读取char。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句