【问题标题】:Alternative while loop without break [closed]没有中断的替代while循环[关闭]
【发布时间】:2020-10-04 19:40:44
【问题描述】:
    int number = 0;

   while (scanf("%d",&number)){

       if (sayi == 1 || sayi == 2){
           printf("Login succesful ");
           break;
       }


    }

没有break怎么写这段代码?

【问题讨论】:

  • break有什么问题让你不想用了?
  • scanf 系列函数将在出错时返回 EOFEOF 定义为负值(通常为-1),在条件中使用时将隐式转换为“true”。因此,如果出现错误或用户按下文件结尾键盘组合,您将陷入无限循环。将返回值与1 进行显式比较。如scanf(...) == 1
  • @Burakkepuc,这没有回答我的问题,继续/中断没有任何问题
  • 您可以使用gotos。您可以(ab-)使用&&|| 运算符或三元运算符并将printf 放入条件中。为什么要使用它?
  • 为什么在循环中需要ifsayi 真的在循环内被改变了吗?如果不只是将它放在循环之外,然后将 while 放在 else 案例的主体中。还是 if 条件应该检查​​ number

标签: c if-statement while-loop scanf


【解决方案1】:

break 在这里更好。它更密切地暗示了更优化的装配输出。 但是你总是可以使用另一个变量(顺便说一句,你对scanf 的错误检查是错误的)。

int number = 0;
_Bool not_broken=1;
while (not_broken){
   if (1!=scanf("%d",&number)) {/*handle error*/}

   if (number == 1 || number == 2){
       printf("Login succesful ");
       not_broken = 0;
   }
}

我建议不要尝试将所有内容都填充到 while 条件中。它的可读性较差,即使scanf 失败最终导致跳出循环(例如,如果您在/*handle error*/ 部分中有not_broken=0),您通常仍然希望做一些不同的事情来响应一个错误而不是响应不同的输入选择。单独的if 是提供此类单独响应的一种更简洁的方式。

(我还冒昧地将sayi 更改为number,因为使用不相关的变量似乎是一个编码错误。)

【讨论】:

  • 请注意,您在逻辑上使用变量number 来检查它是否包含12,但在OP 的代码中它是神秘的sayi,它似乎有与number无关。
  • @RobertSsupportsMonicaCellio 是的。我认为这是一个错误。我已经在答案中编辑了它的提及。感谢您提及!
【解决方案2】:

break 指令只是一个跳转。您可以改用goto 语句。但是,使用goto 是一种不好的做法。使用break,您的代码看起来不错。无论如何,这就是您使用goto 编写它的方式:

int number; // removed assignment as it's unnecessary.

while (scanf("%d",&number)) {
    if (number == 1 || number == 2) { // I believe you meant number not sayhi.
        printf("Login succesful ");
        goto break_label;
    }
}

break_label:
// Put other work here, or return 0 if this is the end of the main.

另一种方法是使用@PSkocik 的另一个答案中提到的标志变量。

【讨论】:

    【解决方案3】:

    你可以在while条件中使用三元运算符:

    while (
           scanf("%d",&number) == 1 && 
           (sayi == 1 || sayi == 2) ? (printf("Login succesful"), 0) : 1
    );
    

    您还可以链接 && || 运算符并使用短路:

    while (
           scanf("%d",&number) == 1 && 
           !( (sayi == 1 || sayi == 2) && (printf("Login succesful"), 1) )
    );
    

    【讨论】:

    • 这很棘手。注意that。 - 可能 OP 的意思是 number 而不是 sayi,但它仍然是一个谜。
    【解决方案4】:

    首先要注意while语句中的条件

    while (scanf("%d",&number)){
    

    即使scanf 的调用不成功,也可以评估为真。所以至少写是正确的

    while (scanf("%d",&number) == 1){

    至于循环,那么你就在这里。

    int number = 0;
    
    while ( number != 1 && number != 2 && scanf("%d",&number) == 1 )
    {
        if ( number == 1 || number == 2 ) printf("Login succesful ");
    }
    

    【讨论】:

      【解决方案5】:

      注意:sayi 似乎在循环中没有改变。所以它的检查最好放在它之外。还是您只是与number 混淆了(这更有意义)。请不要发布不能反映您的问题的邮政编码。


      但只是转储另一种方法,假设有任何进一步的东西可以改变循环中的变量sayi

      您还可以使用带有标志变量的do while 循环:

      int i = 1;
      
      do {
             // Anything that changes sayi (related to variable number).
      
             if ( sayi == 1 || sayi == 2 ) {
                 printf("Login successful. ");
                 i = 0;
             }
      
      } while ( i || (scanf("%d",&number) == 1 )
      

      旁注:

      • while(scanf("%d",&number)) 是危险的/不正确的,就好像发生了输入错误一样,返回的值将是 EOF 的负值,它将被评估为 true 并且循环继续,尽管有错误。改为使用scanf("%d",&number) == 1 作为条件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-19
        • 2017-01-05
        • 2016-08-25
        • 2023-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-18
        相关资源
        最近更新 更多