【问题标题】:scanf read plus sign with integers but not minus, multiplication or divisionscanf 读取带整数的加号,但不读取减号、乘法或除法
【发布时间】:2015-06-15 02:09:10
【问题描述】:

在编写算术表达式简化器时,我刚刚观察到这种奇怪的行为。重新创建了以下问题:

#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,它在n 中读取5,在s 中读取-10,这是预期的输出。

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

编辑


解决了 char by char 读取整数的问题。感谢大家的时间。 :)

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

【问题讨论】:

  • 看看scanf手册页,特别是格式字符串的解释。
  • @Jens 也许我还不够好,无法找到我的答案。以前和现在阅读它。 :(
  • @user3121023 亲爱的先生,这个程序只需要两个输入,5+10 或 5-10。没有理由在 s 中不扫描任何内容。
  • "+10" --> 10 in scanf("%d", &amp;n)scanf("%s", s); 从未被执行。
  • @chux 我怎么能错过。也许需要一些睡眠。谢谢。

标签: c


【解决方案1】:

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

您错了,您可以通过更改 printf() 语句来确定,以便区分哪个生成每个输出。然后您会发现您的程序在循环的第一次迭代中将5 读入n,然后将10-10 读入n,而不是@ 987654327@ 第二次迭代。

这是因为%d 字段描述符读取了一个可选带符号十进制整数。 “可选签名”是指紧接在之前- 表示否定+ 表示肯定。因此,"+10""-10" 都可以通过 %d 字段进行扫描。

【讨论】:

  • 抱歉。感谢您的宝贵时间。
【解决方案2】:

这里两个都在读

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

在第一种情况下,当您键入 5+10 时,在第一次迭代中,5 被读取到 n 中,而在第二次迭代中,+10 被读取到 n 中。由于是正数,+10 和 -10 相同,所以在 printf 语句中打印 10

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

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

这也解释了第二种情况。 -10 正在被读取到 'n' 并使用 "%d" 打印

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多