0

我知道这个 while 循环问题很常见,通常是由输入流中的换行符引起的。但是,我无法修复我的 while 循环,而且我真的不明白为什么会发生这种情况。

考虑以下示例:

 int main()
 {
   int option = -1;
   char buffer[100];
   while (option != 10)
    {
     while(printf("Enter menu choice: \n"), gets(buffer), option < 0)
           {
             some code here dealing with buffer and assigning input to option...
           }
     printf("something\n");
     }
    return 0;
  }

忽略此代码的实现(例如,将输入存储为整数而不是字符串等),因为它只是我的 while 循环案例的简化版本。让我担心的是,在它真正通过循环之前,我必须输入两次数字。

输出:

进入菜单选择:1

进入菜单选择:1

所有灯都打开 灯光设置:1111 1111 1111 1111

我不确定为什么会在这种情况下发生...谢谢!

更新:感谢您的回答。我通过重写我的 while() 条件来修复代码

while(printf("\nEnter menu choice: \n"), gets(buffer),  option = checkMenuOption(buffer), option < 0 && strcmp(buffer, ""));
4

2 回答 2

2

我可以建议您使用fgets代替gets吗?它更安全,可用于防止缓冲区溢出。

另外,我已经稍微改写了您的代码,这会做您感兴趣的事情吗?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int option = -1;

    char buffer[100];

    while (option != 10)
    {
        printf("Enter menu choice: \n");

        fgets(buffer, 100, stdin); /* get input from the standard input
                                      and save it in the buffer array */

        option = atoi(buffer); /* convert input to integer */
    }

    return 0;
}

如果用户输入“10”,程序将退出:

$ ./a.out 
Enter menu choice: 
10
$

如果你想在这里保留旧代码,它是:

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int option = -1;
    char buffer[100];
    while (option != 10)
    {
        while(printf("Enter menu choice: \n"), gets(buffer), option = atoi(buffer), option < 0)
        {

        }
        printf("something\n");
    }
    return 0;
}

问题是您没有option在循环条件中分配任何内容。在第一次测试期间,option仍然不是 10,它只是在正文中变为 10。在第一次运行选项被分配 10(或您输入的任何内容)之后,while 循环仍然没有评估它,这就是它打印的原因再次声明,它要求您输入一个值。

您可以像这样重写循环来测试我的声明(确保代码更新option仍在正文中):

while(option < 0 && printf("Enter menu choice: \n") && gets(buffer))

最后,不要使用逗号,因为用逗号分隔的语句将始终被执行(我认为这不是你想要的,在其他情况下它可能完全没问题),它只是测试的列表中的最后一个成员真假。看看这个

于 2013-05-30T11:41:36.990 回答
0

printf() 和 gets() 在while评估option.

事实上,对于当前的行为,您实际上不必输入两次数字:您必须输入一次数字,然后输入任何内容,这样 gets() 就会返回。

编辑:我添加了一些关于它如何运行的细节:

  • 指令指针到达while语句的最开头,开始评估其条件
    • 调用 printf()
    • 调用gets()
    • 评估option < 0,这是真的。
  • while声明 正文
    • 代码解析字符串,设置option为大于零的值。
  • 指令指针被循环回评估条件
    • 调用 printf()
    • 调用gets()
    • 评估option < 0,这是错误的。
  • while循环终止
    • 来电printf("something\n");

在这里可以看出,缓冲区一旦被gets() 填充,仅在第一次迭代中被代码读取,而在第二次迭代中被忽略。

于 2013-05-30T11:36:49.377 回答