【问题标题】:How to replace do while loop , by for loop or while loop?如何用 for 循环或 while 循环替换 do while 循环?
【发布时间】:2021-07-27 03:53:54
【问题描述】:

这是我的代码,我如何用 for 循环或 while 循环替换 do while?我应该改变什么?

int main() {
  int a;
  do {
    printf("\nEnter 1 to continue: ");
    scanf("%d",&a);
    if (a==1){
      function=initial(function);
      break;
    } else {
      function=final(function);
    }
  } while (a!=1);
}

【问题讨论】:

  • 用户输入 1 的情况下的 break 语句与短语“\nEnter 1 to continue:”相矛盾。:)
  • 为什么要改?
  • break;} while (a!=1); 一起没有意义
  • 函数名final 没有意义,因为循环在final 之后继续,但在initial 之后停止。非常混乱

标签: c for-loop while-loop do-while


【解决方案1】:

for 循环不适合这种情况,您不要迭代任何内容(如果您真的想的话,您仍然可以使用一个)。

要使用while循环,请将a初始化为0

int a = 0;
while(a != 1){
    ...
}

对于for循环:

int a = 0;
for(;a != 1;){
    ...
}

但这些都无关紧要,因为无论如何,只要a 等于1,您就会跳出循环。

【讨论】:

  • 在 for 循环中,我会将 int a = 0 移动到 for 循环中。
【解决方案2】:

我发现在输入字母后很难解决繁忙循环的问题:您的 scanf 什么也没读,因为没有数字,但字母仍在输入中。

所以屏幕被“输入 1 继续”淹没了,你输入“1”,即使你希望它停止,但只有 ctrl-c 有帮助。

如果您真的想要整数“1”或“+1”或“001”作为测试(而不是例如字母“1”的第一次出现),那么您必须阅读整行(=用户确认的内容通过输入)作为字符串并将其转换为整数。

这使用%ms 格式 - m 像内存分配。我把它放在一个函数中,所以它适合 while() 条件。否则只是while(1)for(;;) 休息。

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

char *scanf_line1(char *line) {
        printf("Enter 1 to continue: ");
        scanf("%ms", &line);
        return line;
}
int main() {
    int loop = 0;
    char *line;

    while(atoi(scanf_line1(line)) != 1)
        loop++;
    
    printf("OK, continuing after %d extra loops\n", loop);
}

印象:

$ ./a.out
Enter 1 to continue: -1
Enter 1 to continue: +1
OK, continuing after 1 extra loops
$ ./a.out
Enter 1 to continue: 111
Enter 1 to continue: r
Enter 1 to continue: rrrrrrrrr1
Enter 1 to continue: rrrrrrrrrrrrrrrrrrrrrr 1
Enter 1 to continue: OK, continuing after 4 extra loops
$ ./a.out
Enter 1 to continue: 5 4 3 2 1
Enter 1 to continue: Enter 1 to continue: Enter 1 to continue: Enter 1 to continue: OK, continuing after 4 extra loops
$ ./a.out
Enter 1 to continue: 2 00000000000000000000001
Enter 1 to continue: OK, continuing after 1 extra loops

突然间,它可以处理隐藏的数字,而不是崩溃。只是该行中每个非 1 单词的重复消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多