在C中,我如何只接受某些字符串并继续询问用户输入,直到输入有效输入?

时间:2015-09-12 21:53:57

标签: c input while-loop

我试图在C中编写一个简单的程序,它接受一个字符串并根据该输入执行一个动作。但是,如果用户输入了无效字符串,我希望程序再次询问用户输入,直到用户提供有效的输入字符串。

示例输出:

P: Please enter a string.
U: runMarathon
P: Unable to process request, please enter a valid Input:
U: rideBike
P: Unable to process request, please enter a valid Input:
U: sayHello
P: Hello World.

我有一个这样的程序:

int num;

while (scanf("%d",&num) != 1 || num <= 0)
{
    printf("Please enter an integer greater than 0\n");
    fflush(stdin);
}

这个程序似乎有效;但是我有一位经验丰富的C开发人员告诉我永远不要使用fflush(stdin)。

这是我到目前为止所做的:

int main()
{
    char input[];
    while (scanf("Please enter a command: %s\n",input))
    {
        printf("Your command is this: %s\n",input);
    }
}

但是在运行此方法时,在接受输入后,程序将不断打印出来:

Your command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: Hello

等等。我很惊讶我找不到任何看似简单问题的资源。我知道我可以使用strcmp比较字符串,但是如何让while循环在再次打印出响应之前等待用户输入?为什么我不能使用fflush(stdin)?

感谢任何意见,谢谢!

3 个答案:

答案 0 :(得分:3)

意外输入的问题是scanf不会从输入缓冲区中删除该输入,因此下次循环迭代它将尝试读取相同的意外输入。

解决此问题的最常见方法是使用例如fgets,然后在字符串上使用sscanf

答案 1 :(得分:1)

为什么我不能使用fflush(stdin)

从技术上讲你可以做到但你必须非常小心,因为{C}标准只为输出/更新流而不是输入流定义fflush,因此fflush(stdin)的行为是未定义。然后,一些实现可以是例如清除输入缓冲器。如果您真的迫切需要使用它,请参阅您的实现文档和代码。

C-99标准§ 7.19.5.2/2/3 fflush功能

  

概要

     

1   #include <stdio.h> int fflush(FILE *stream);

     

2如果流指向输出流或其中的更新流   最近的操作没有输入,fflush功能导致   要传递给主机的该流的任何未写入数据   要写入文件的环境;否则,行为是   未定义。

     

3如果stream是空指针,则执行fflush功能   对定义了行为的所有流的此刷新操作   上方。

     

返回

     

4 fflush功能设置流的错误指示符   如果发生写入错误则返回EOF,否则返回零。

答案 2 :(得分:0)

你可以这样做:

int main()
{
    char input[50];
    do
    {
        printf("Please enter a command:");
        if (scanf("%s", &input) != 1) //scanf returns the number of args successfully received
        {
            printf("Please enter a command\n");
        }

        printf("Please enter a valid command!\n");

    } while (strcmp(input, "good") != 0); //repeat above until input = "good"

                                          //print the good command
    printf("Your command is this: %s\n", input);
    return 0;
}

有一点需要注意的是,您应该始终确保您正在编写的缓冲区足够大,以容纳放入其中的内容。