【问题标题】:How does scanf work in this simple program?scanf 在这个简单的程序中是如何工作的?
【发布时间】:2014-01-28 18:48:08
【问题描述】:

我在 while 循环中使用 scanf 时遇到了一些问题。 我想制作一个程序,要求用户写入三个整数并将它们保存在三个位置的数组中。如果用户写了一些不是整数的东西,程序应该继续请求一个整数,直到他输入它。但它不能正常工作。

所以我试图用这段代码来简化问题:

#include <stdio.h>

int main()
{
    int num1=1;
    int num2=2;
    int num3=3;

    printf ("write a number\n");
    scanf("%i", &(num1));
    printf("%i\n",num1);

    printf ("write a number2\n");
    scanf("%i", &(num2));
    printf("%i\n",num2);

    printf ("write a number3\n");
    scanf("%i", &(num3));
    printf("%i\n",num3);
}

如果输入是 3 个整数,则没有问题。但是,如果您为第一个整数写一个字符,例如 a,则不会扫描其他 2 个值,它只是写: 一种 2 3 最后两个值是初始化值。

谁能告诉我该怎么做?

【问题讨论】:

  • 你必须使用fgets()
  • 感谢您的帮助。但是你能解释一下发生了什么吗?
  • @Trouble-lling 实际上,我并不完全知道。我不使用scanf(),完全是因为它像这样的不当行为。

标签: c scanf


【解决方案1】:

scanf函数在遇到输入的第一个无效字符后不必再读取。

%i 说明符允许 a 为十六进制,但必须以 0x 开头。

如果 a 是输入中的第一个字符,并且它应该与 %i 匹配,那么 scanf 之后就不必读取任何内容 - 它可以在第一个无效字符处停止..

参考资料: http://www.gidnetwork.com/b-64.html

【讨论】:

  • 感谢您的帮助。该链接很有帮助。
【解决方案2】:

对于每个转换说明符scanf 尝试定位适当的数据项。 scanf 读取该项目,当遇到不可能属于该项目的字符时停止。如果任何项目未成功读取,则scanf 立即返回,而不查看格式字符串的其余部分。
当您输入 a 5 10 时,scanf 会为说明符 %i 找到 a。它立即返回并停止读取其他输入 510

【讨论】:

  • 顺便说一句,这只是我,还是从某个手册页直接引用?这听起来对我来说很熟悉。
  • @H2CO3;我也是 :)。我在一本书中读到了这个。但不是来自man 页面。
  • 不,这不是 H2C03 的报价。
  • @Trouble-lling;标记答案左侧的“V”图标。
  • @Trouble-lling 显然是引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2012-08-27
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多