为什么在Linux中无法读取“ +”和“-”?

欢迎

我有这段代码片段,可以将算术表达式读取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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Google Colab引发在csv和jupyter笔记本中无法读取的错误?

为什么在我的程序-pthread Linux中无法设置计划的策略和参数?

在Linux中复制,读取和删除文件的命令是什么

为什么在 codeigniter 中无法正确计算秒和分钟?

为什么Java BufferedReader()无法正确读取阿拉伯和中文字符?

为什么在执行 GET XmlHttpRequest 时无法读取和提取此 HTTP 标头?

为什么我无法从Delphi VCL应用程序读取和写入Amazon S3?

为什么组件无法读取 angular 和 typescript 中服务返回的数据?

linux c共享内存:为什么写入和读取时内容的顺序相反

为什么 sscanf 无法从一个字符串中读取 uint64_t 和字符?

为什么Aircrack-ng能够在合理的时间内读取和使用Leafpad无法读取的.lst文件?

为什么即使 iOS Safari 和 Firefox 能够读取我网站 CSS 的更改,Chrome 也无法读取?

脚本为什么不能正确地从%SetWidth%和%SetHeight%中读取变量数据?

在将脚本传递到bash时,为什么不能从`stdin`和`read`中读取内容?

为什么我使用以下代码从valgrind中获取“无效读取”和“无效写入”?

Createfile2,ReadFile和WriteFile;为什么ReadFile不读取我在WriteFile中编写的内容?

为什么LIB和DLL无法互换?

无法从表中读取(SQL和PHP)

为什么使用Swagger和OIDC会收到“无法从服务器读取错误信息”?

尝试使用children属性和offsetWidth时,为什么在控制台中收到无法读取的属性消息?

为什么在我的布局中我无法在一行中对齐ImageView和TextView?

为什么从方法和外部读取的类变量不同?

为什么dd从同一磁盘读取和写入?

为什么“ <=”和“> =”与“ <”,“>”和“ ==”无关?

为什么p:ajax无法在primefaces 5和JSF2中更新h:outputText?

为什么在C#构造函数中无法同时使用:base()和:this()

为什么无法在事件处理程序中访问状态和道具

为什么在开始和结束字符串之间删除在Java中无法正常工作?

为什么PatriciaTrie中无法访问“ floorEntry”和其他方法?