当前位置: 首页 > 知识库问答 >
问题:

在C语言中,如何只接受某些字符串并继续要求用户输入,直到输入有效的输入?

伯英武
2023-03-14

我试图用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个答案

荀嘉熙
2023-03-14

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

从技术上讲,您可以这样做,但您必须非常小心,因为C标准只为输出/更新流定义了fflush,而不是为输入流定义了fflush(stdin)。然后,一些实现所做的可能是例如清除输入缓冲区。如果您确实迫切需要使用它,请查阅您的实现文档和代码。

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

提要

1#包括

2如果流指向未输入最新操作的输出流或更新流,则fflush函数会导致将该流的任何未写入数据发送到主机环境,以写入文件;否则,行为是未定义的。

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

返回

4 fflush函数为流设置错误指示器,如果发生写入错误,则返回EOF,否则返回零。

贲宏硕
2023-03-14

你可以这样做:

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;
}

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

须衡虑
2023-03-14

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

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

 类似资料:
  • 我正在写一个叫做hangman.py的程序。在我的程序中,用户不能在我的输入中输入“?”或空白。例如,用户不能输入“?xx?xx?”或“我该怎么做”。但用户可以输入诸如“ldkdjgg”或“stop-go”之类的内容。如果用户输入诸如“?xxxxx”或“我该怎么做”之类的内容,我必须不断询问用户请输入一个不包含的要猜测的单词?或空白:“.我的问题是如何打印”请输入一个不包含字符的要猜测的单词?或空

  • 我已经看了这个程序几个小时了,但我仍然不明白其中的逻辑。程序要求用户输入整数。 一旦用户输入了整数,它将向用户输出所有的正数、负数和输入的总数,以及这些数字的平均值。 这是我陷入困境的地方: 然后它会询问用户是否要继续。用户将输入或以指示他们是否要继续。如果用户输入“y”,循环将再次进行,如果他们输入“n”,它将显示再见消息。我不知道如何设置。 我已经尝试了一个 do while 循环,我目前正在

  • 我希望“请输入一个带有字母S的句子”循环,直到用户输入字母“S”

  • 我需要使用while循环来询问用户一个介于1-100之间的数字,如果用户输入的数字是负数或超过100,我会告诉用户他们输入了错误的数字。这是我到目前为止的情况。每当我运行它时,它都会要求用户输入。当输入为负数或大于100时,它表示无效数字,而当用户输入为45时,当0-100之间的数字有效时,它仍表示无效数字。我不认为这是阅读代码的最后一部分。

  • 我正在做一个问题,其中我为拼字游戏创建了各种功能。首先,我想让用户输入或或开始新游戏/重放最后一手牌/结束游戏。 一旦游戏开始,我想让用户输入或来让用户或计算机玩。 我陷入了问题的最后一部分。 我的代码: 如果内部循环的选择不是u或c,它应该反复通知并询问,直到u或c是输入。但它是在初审后从那个循环中出来的。 理想输出: 我的输出: 问题是,当用户在第二级输入无效命令时,我的代码开始询问第一级的问

  • java中的这段代码 boknam[variable]指的是bookname&bokauthor[variable]指的是bookAuthor只是为了避免混淆[这不是重点] 它跳过以bookNAme作为输入,它只是以bookAuthor作为输入,请帮助将被删除 boknam=scan.nextline();这里的这行不起作用,不要求输入注意:-变量已经被分配给不要说你没有初始化字符串boknam