如何在测试条件下使scanf()工作?

时间:2018-06-10 12:45:53

标签: c

如果用户输入了一个字符而不是一个数字,我想给他另一个选项再试一次,但是下面的代码打印出来"无效。请输入一个数字。"永远如果用户输入一个字符而不是一个数字。为什么它不等待用户再次进入? (scanf部分是我假设的)

#include <stdio.h>
long get_long(void);

int main(void) {
long start;

printf("Enter a number: ");
start = get_long();

return 0;
}

long get_long(void)
{
long num = 0;   
while (scanf("%ld", &num) != 1)
{       
    printf("Invalid. Pls enter a number.");
}

return num;
}

3 个答案:

答案 0 :(得分:0)

这是scanf的常见问题。 (这个问题已被多次询问;可能有重复的答案。)问题是当你键入不是有效数字的simething时,scanf失败(并返回0),但是它在输入流上留下不匹配的输入

你必须以某种方式刷新未读输入。一种方式是这样的。写下函数

void flush_one_line()
{
    int c;
    while((c = getchar()) != EOF && c != '\n')
        { /* ignore */ }
}

此函数读取并丢弃一行输入,直到换行。 (也就是说,它抛弃了之前scanf调用没有读过的任何内容和所有内容。)

然后像这样修改原始程序:

while (scanf("%ld", &num) != 1)
    {
    printf("Invalid. Please enter a number.");
    flush_one_line();
    }

答案 1 :(得分:-1)

像这样。它执行2次

    int i=1;
    while (i!= 2)
    {      scanf("%ld", &num) ; 
         if(num==1)
           break;
        printf("Invalid. Pls enter a number.");
    i++;
    }

答案 2 :(得分:-1)

你的代码背后的逻辑是有缺陷的。你基本上对你的代码做了什么,只要没有正确的输入,就要求while循环工作。

while(incorrect input is made) {
    print
}

正确的解决方案将是

while(number of tries > 0) {
    do operations
    check for right input, if it is correct break the loop, else keep on going
    decrement number of tries by one
}