【问题标题】:How can validate, so that the user can enter only positive integers如何验证,让用户只能输入正整数
【发布时间】:2014-09-18 06:44:13
【问题描述】:

如何使用单个 while 循环来限制在代码中输入负整数。我之前尝试过为两个 scanf() 分别使用两个 while 循环,并且效果很好。但我无法弄清楚我们如何将它们组合成一个 while 循环。我已经删除了我最初使用的两个 while 循环。我对此完全陌生,我需要一些想法。

#include <stdio.h>

int main()

{   
    int num, uplimit, a;

    printf("Which multiplication table do you want? ");

    scanf("%d",&num);

    printf("Please enter the upper limit: ");

    scanf("%d",&uplimit);


    printf("\nMultiplication Table for %d\n", num);

    printf("===========================\n\n");


for(a=1;a<=uplimit;++a)

{

    printf( "%d X %d = %d  %s\n", a, num, num*a, (num*a % 2 == 0) ? "*" : " " );

}

{

    printf("\n* indicates even multiple of %d", num);

}

return 0;
}

【问题讨论】:

  • 如果您阅读例如this scanf (and family) reference 您将看到格式代码表。我相信您可以找到一种适合读取非负整数的格式。
  • @JoachimPileborg:你的意思是 %u 和 %x?他们确实接受负面输入。例如,输入 -1 将给出 UINT_MAX,不会显示错误。

标签: c


【解决方案1】:
char c;

while (((c = getchar()) != '\n') && (c != EOF));
scanf("%d",&num);
while (num < 0)
{
    printf("You should use positive numbers!");
    while (getchar() != '\n');
    scanf("%d", &num);
}

如果输入中有一些字母,则内部 while 会清理输入缓冲区。 此外,将while (((c = getchar()) != '\n') &amp;&amp; (c != EOF)); 移动到函数中也是有意义的。

【讨论】:

  • 可以通过 do while 和其他绑定得到更多改进。
  • do {} 如果第一次输入尝试正确且没有额外检查,则不能不写错误消息,是吗?
  • 好吧,但是我输入 10a 怎么样。您的代码会说没问题,但用户输入的是 10a 而不是 10
  • 我已经试过了。它不会说没问题,它会在下一个数字中进入无限循环 - 我们需要在读取之前刷新输入,因为它会在其中留下“a”。固定答案。
  • fflsuh()仅适用于 Windows。所以这还不是标准答案。一旦它成为一个,我将删除我的反对票。
【解决方案2】:

只需将您的 scanfs 替换为:

while(scanf("%d", &num) != 1 || num < 0)
    while ((c = getchar()) != '\n' && c != EOF);

【讨论】:

  • 我正准备回答这个问题。想多了。你需要吃掉废话,即如果它不是数字,则吃下一个字符。顺便说一句 -1 很苛刻,我会纠正它
  • 谢谢,是的,我不明白它来自哪里 :)
  • 当您输入一个 char 而不是一个整数时,scanf 不会接受它,因此会保留在缓冲区中,下次再次循环时,scanf 将看到该 char。所以你需要以某种方式清除它
  • @mSatyam 感谢您指出这一点,这确实非常重要,我在这里回答得太快了。我现在已经编辑了我的答案。
  • 是的,有时我也很想念它。没有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2011-07-20
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多