【问题标题】:anomalous behaviour of scanfscanf 的异常行为
【发布时间】:2010-02-10 04:02:55
【问题描述】:

想知道关于 C 的一切,你能揭开它的神秘面纱

我正在使用涡轮增压 C

我有这个代码

scanf(“%d , %d”,&a,&b);
printf(“%d,%d”,a,b);
scanf(”%c”,&c);
printf(“%d,%d”,a,b);

然后 scanf 不扫描 c 的值

输出为:1,2

如果我用这个

scanf(“%d , %d”,&a,&b);
printf(“%d,%d”,a,b);
scanf(”%c ”,&c);//note a blank after %c
printf(“%d,%d”,a,b);

然后扫描c的值。

输出为 1,2 1,2

相同的代码

scanf(“%d , %d”,&a,&b);
printf(“%d,%d”,a,b);
scanf(”%1s”,&c);
printf(“%d,%d”,a,b);

在此段中a的值将被显示,但b的值将设置为0

输出为 1,2 1,0

你能解释一下这两个问题的答案吗?

没有得到答案但请帮助我.......

【问题讨论】:

  • 请显示您正在操作的输入
  • 类型在这里也很重要。
  • 当 Eli 要求您展示输入时,他的意思是向我们展示准确您输入的内容。 是否您输入的是字母和等号?

标签: c scanf


【解决方案1】:

在您的最后一种情况下,这与在内存中设置值的位置有关。

第二个scanf将长度为1的字符串放在c的地址处——即一个字符,后跟空终止符。

猜猜空终止符在哪里?

【讨论】:

    【解决方案2】:

    你怎么知道在第一种情况下没有字符被扫描c?我认为这是因为您提供了一个未展示的打印声明并且没有看到任何内容。

    仔细阅读手册页,了解 %c 说明符的行为:

    c
    匹配一系列宽度计数字符(默认为 1);下一个 指针必须是指向char的指针,并且必须有足够的空间 对于所有字符(不添加终止 NUL)。 平常的 前导空白的跳过被禁止。 跳过空白 首先,在格式中使用显式空格。

    [强调添加]

    如果您输入的格式类似于1, 2 a,则第一次扫描会吃掉1 , 2 并留下a,此时第二次扫描会吃掉空格。不确定第二个示例在这种情况下如何工作。

    Anon. is on the money about the third case.

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多