【问题标题】:Loop statement problems循环语句问题
【发布时间】:2014-02-14 17:47:14
【问题描述】:

在我的程序结束时,我想询问用户是否要退出。

问题:我想创建一个循环,如果用户输入nN,它将把用户发送到开始(A 点),或者 如果他输入yY,则到我的程序结束(C 点),如果他输入其他任何内容,则到程序中间(B 点)。

我如何做到这一点?

#include <stdio.h> 
int main()
{
  char exit=n;
  A POINT
  // imagine here some stuff
  // some more stuff
  // just a bit more junk
  // some other C statements
  B POINT
  printf("wana exit? press y/n);
  scanf("%c", &exit);
  C POINT
  return 0;
}

【问题讨论】:

  • 这不是您的实际代码,因为它甚至无法编译。此外,scanf 本质上是不安全的。
  • 是的,我很抱歉,我不知道我必须输入实际代码。另外为什么每个人都告诉我它不安全?我该怎么办 ?为什么不安全?
  • @BeucaN “他们”指的是goto吗?
  • @Njol 很确定他们指的是 scanf,不知道 goto 函数,对不起:/
  • scanf 是不安全的,因为它不执行任何类型的缓冲区大小检查,即缓冲区溢出是一种严重的可能性。要获取单个字符,只需使用getchar。对于字符串使用fgets

标签: c loops while-loop stdio


【解决方案1】:

这是非常基本的。您真正要问的是如何根据有效响应控制主循环,并在响应无效时继续提问。一种方法是使用该值作为循环条件。

do {

    // etc etc...


    // Ask question until yes or no answer
    do {
        printf("Wanna exit? Press y/n\n");
        if( 1 != scanf("%c", &exit) ) {
            printf("Input failed.  Exiting.\n");
            exit = 'y';
        }
        exit = tolower(exit);
    } while(exit != 'y' && exit != 'n');

} while(exit != 'y');

其他方法使用循环控制结构,例如breakcontinue。使用这些已经有答案了。

【讨论】:

    【解决方案2】:

    你可以将main中的整个代码包裹在一个do { ... } while (false)中,使用continue;返回顶部,使用break;退出循环,例如:

    main() {
        do {
            // your code
            if (exit == 'n')
                continue;
        } while (false);
    }
    

    PS:你可以使用goto,但这是非常不鼓励的,所以最好不要开始使用它。

    【讨论】:

    • 这个怎么样:do { ... } while ( exit == 'n' );
    • 至于goto,别去那里……等一个关于有限状态机的问题,然后也许……
    • 如果你真的想要一个永久循环,至少将它设为 for (;;)while(1) 以便从顶部清楚地表明这是一个永久循环
    • @NedNowotny 这需要在循环之外定义退出,但我实际上会自己使用它。编辑:这就是为什么我实际上使用了 do while 但后来我在写答案时改变了主意^^
    • @Brandin 它根本不是一个循环:while (false)。它只是一个能够跳到它的开始和结束的块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    相关资源
    最近更新 更多