【问题标题】:Using while(getchar()!='\n') I empty the stdin, but I have to push on Enter key使用 while(getchar()!='\n') 我清空标准输入,但我必须按下 Enter 键
【发布时间】:2015-06-30 13:23:27
【问题描述】:

我正在使用 while(getchar()!='\n') 来清空我的标准输入,但有时如果我想继续,我需要按 Enter 键,因此计算继续......为什么?我将发布我的部分代码:

while(1){
   if(fgets(buffer,MAX_DIMENSION,stdin)==NULL){ perror("Error"); exit(1);}
   }else{
       printf("Not correct term\n");
       while(getchar()!='\n');
       sleep(1); 
   }
}

谢谢!

@iharob 如果我设置 MAX_DIMENSION=1240 并作为输入发送:a string > 1024 它在标准输入中仍然存在,所以我必须使用 while(getchar()!='\n')

【问题讨论】:

  • 为什么这么多人乱用while (1)?...而且fgets()你也不需要清空任何东西。

标签: c unix fgets enter getchar


【解决方案1】:

您已使用fgets 获取字符串。该字符串由换行符终止。然后,您尝试使用getchar 清空 stdin 并将某些内容放入getchar,您必须输入另一个换行符。如果这是您想要的,您可以简单地忽略 fgets 之后的缓冲区。无需使用getchar清空缓冲区。

【讨论】:

    【解决方案2】:

    2 个问题:

    1:代码有多余的}

    //                                                                   here
    if(fgets(buffer,MAX_DIMENSION,stdin)==NULL){ perror("Error"); exit(1);}
    }else{
    // or at the beginning
    

    2:假设上面不是问题,那么@unxnut 回答,通常fgets() 包含'\n' 并且没有必要empty stdin

    然而,当行太长并且'\n' 没有被fgets() 读取时,那么读取直到找到结尾是有意义的。

      if (fgets(buffer, MAX_DIMENSION, stdin) == NULL) {
        perror("Error");
        exit(1);
      }
      if (strchr(buffer, '\n') == NULL) {
        int ch;
        printf("Not correct term\n");
        while (((ch = getchar()) != '\n') && (ch != EOF))
          ;
        // while(getchar()!='\n');
        sleep(1);
      }
    

    【讨论】:

      【解决方案3】:

      fgets() 函数从stdin 中捕获'\n',您正在使用getchar()stdin 中提取'\n',但它已经被fgets() 使用了,这就是您需要一个的原因额外的\'n'

      而且,您不检查 getchar() 是否返回 EOF 而不是字符。而且在我看来,while (1) 循环,很难遵循逻辑

      char buffer[MAX_DIMENSIONS];
      while (fgets(buffer, sizeof(buffer), stdin) == NULL)
      {
         printf("Not correct term\n");
         sleep(1); 
      }
      

      会更好。

      【讨论】:

      • 如果我设置 MAX_DIMENSION=1240 并且我作为输入发送:一个字符串 > 1024 它仍然是标准输入上的剩余部分,它被用作下一个输入,所以我必须使用 while(getchar()!= '\n')
      • 不行,你应该使用while (getchar() != EOF),但它也会阻塞,你想做什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      相关资源
      最近更新 更多