C - 基于用户决策的do / while循环无法正常工作

时间:2015-12-24 17:29:37

标签: c stdin

我遇到一个问题,经过多次测试后,我认为这是因为我不了解输入缓冲区的工作原理。

我有一个while循环,它应该继续迭代,直到用户输入“no”来停止迭代。

我有两个问题。

  1. 如果用户输入“no”或任何不等于“yes”的内容,while永远不会停止迭代
  2. 正如您所看到的,第二个周期的输出存在问题。该程序不会要求用户输入字符串并跳过该步骤,就像用户只输入ENTER一样。
  3. CODE:

    int foo = 0;
    
    do{
    
      int i, cycles;
      char array[MAX_LENGTH+1];
    
    
    
      for(cycles=0; cycles < MAX_READ_CYCLES; cycles++){
    
        i=0;
    
        printf("\n\nEnter a string: ");
    
        char ch;
        while ((ch = getchar()) != '\n' && ch != EOF) {
          array[i] = ch;
          i++;
        }
    
        array[i] = '\0'; //string terminator
    
    
        printf("String you entered: %s\n", array);
    
        printf("\nDo you want to continue? 1: yes / 0: no \n");
        scanf("%d", &foo);
    
      }
    
    } while( foo == 1);
    

    输出

    Enter a string: test
    String you entered: test
    
    Do you want to continue? 1: yes / 0: no
    0
    
    Enter a string: String you entered: 
    
    Do you want to continue? 1: yes / 0: no
    3
    
    Enter a string: String you entered: 
    
    Do you want to continue?
    

2 个答案:

答案 0 :(得分:5)

如果用户因内部"yes"循环而输入for,则您的程序不会终止:

#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 100
#define MAX_READ_CYCLES 100

int main() {
    int cycles = 0;
    char foo[4];
    do {
        char array[MAX_LENGTH + 1];

        printf("\n\nEnter a string: ");

        char ch;
        int i = 0;
        while ((ch = getchar()) != '\n' && ch != EOF) {
            array[i] = ch;
            i++;
        }

        array[i] = '\0'; //string terminator


        printf("String you entered: %s\n", array);

        printf("\nDo you want to continue?");
        scanf("%s", foo);

        cycles++;

        while ((ch = getchar()) != '\n' && ch != EOF); // force drop stdin

    } while (strcmp(foo, "yes") == 0 && cycles < MAX_READ_CYCLES);
}

另见I am not able to flush stdinhttp://c-faq.com/stdio/stdinflush2.html

答案 1 :(得分:0)

您正在创建一个3字节的字符数组,然后将三个以上的字节存储到其中。不要忘记,最后会有一个空值。由于您没有分配足够的空间,因此您将覆盖其他内存位置,这些位置将始终创建未定义的行为。

另请注意,此处的scanf非常不安全。初始化像这样的字符数组也是无效的:char foo[3]="";