【问题标题】:getchar waiting for input (enter) before continuinggetchar 在继续之前等待输入(回车)
【发布时间】:2020-05-13 20:11:53
【问题描述】:

我有一个想要获取用户输入的函数,并一直要求用户输入,直到输入 2 或 3。我现在遇到的一个小问题是,在输入 2 或 3 并按 Enter 后,我需要再次按 Enter 才能继续程序的下一部分。甚至可以使用 getchar 而不会遇到这个问题吗?我一直没能找到合适的解决方案

int getPlayersNumber() {
    int numberOfPlayers;
    do {
        printf("\nHow many players will be playing ? (2 or 3) ");
        scanf("%d", &numberOfPlayers);
        while (getchar() != '\n');
    } while (numberOfPlayers != 2 && numberOfPlayers != 3);

    printf("\n");
    flushInput();

    return numberOfPlayers;
}

【问题讨论】:

  • 谢谢,但我现在遇到的问题是,当什么都不输入并按回车键时,程序会卡在这个方法中
  • 您对任何答案的反应几乎为零。你有没有试过看他们中的任何一个?

标签: c getchar


【解决方案1】:

在开始时使用 getchar 来读取 2 或 3 而不是 scanf。

【讨论】:

    【解决方案2】:

    我尝试重现您的问题,我没有输入flushInput,因为我不知道它来自什么。但是我没有遇到你的问题。我认为while (getchar() != '\n'); 足以解决您的问题。这个问题可能是程序的其他部分引起的,你能粘贴整个代码吗?

    【讨论】:

    • 似乎是 flushInput 导致了我遇到的问题。我监督了它。谢谢!
    【解决方案3】:

    您的代码取决于启动时numberOfPlayers 的值。因为没有初始化,所以没有办法知道会发生什么。

    改变这个:

    int getPlayersNumber() {
        int numberOfPlayers;//not initialized
    

    到这里:

    int getPlayersNumber() {
        int numberOfPlayers == 0;//not == 2 or 3 
    

    并且不需要flushInput 正在做的任何事情。如果定义为调用fflush(stdin);,则可能是未定义的行为。

    您的代码对我来说很好,编辑如下:

    int getPlayersNumber(void) {
        int numberOfPlayers = 0;
        do {
            printf("\nHow many players will be playing ? (2 or 3) ");
            scanf("%d", &numberOfPlayers);
            //while (getchar() != '\n');
        } while (numberOfPlayers != 2 && numberOfPlayers != 3);
    
        printf("\n");
        //flushInput();
    
        return numberOfPlayers;
    }
    

    【讨论】:

      【解决方案4】:

      使用“scanf”进行交互式输入是一个常见的错误。 SO中有很多与此相关的问题-如user3121023评论中所述,请参阅下面的常见替代方法,使用fgets。

      int getPalyersNumber () {
        char work[64] ;
        while ( fgets(work, sizeof(work), stdin) != NULL ) {
          int numberOfPlayers ;
          if ( sscanf(work, "%d", &numberOfPlayers) == 1 ) {
            if ( numberOfPlayers == 2 || numberOfPlayers == 3 ) {
               return numberOfPlayers ;
            }    
          } ;
          fprintf(stderr, "Bad Input!\n") ;
        } ;
        perror("Error Reading Data") ;
        abort() ;
      }
      

      可以自定义错误处理 - 但当fgets 返回 NULL 时需要一些纠正措施 - 无法重试读取。简单重试会使代码在 EOF 或其他错误上无限旋转。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        相关资源
        最近更新 更多