如何限制一个字母输入?

时间:2016-10-02 08:48:01

标签: c

我意识到如果输入是一个以' y'开头的单词。或者' n',它将逃脱循环。除非输入是单个字符,否则如何限制循环以使其继续循环?

do
{
    printf("Do you want to try again? (Y/N): ");
    fflush(stdin);                              
    scanf("%c", &repeat);
    repeat = toupper(repeat);
    if (repeat != 'Y' && repeat != 'N')         
        printf("Invalid answer. Please enter 'Y' or 'N'.\n\n");

} while (repeat != 'N' && repeat != 'Y'); 

3 个答案:

答案 0 :(得分:1)

像这样:

ngMap

答案 1 :(得分:0)

除了使用scanf()之外,可以使用fgets()读取一行,然后解析一行:

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


int main(void)
{
  char repeat = '\0';

  do
  {
    int input_valid = 0; /* Be pessimistic. */
    char line[3] = {0};

    puts("Do you want to try again? (Y/N):");

    do /* On-time loop, to break out on parsing error. */
    {
      if (NULL == fgets(line, sizeof line, stdin))
      {
        break; /* Either fgets() failed or EOF was read. Start over ... */
      }

      if (line[1] != '\0' && line[1] != '\n') 
      {
        break; /* There was more then one character read. Start over ... */
      }

      line[0] = toupper(line[0]);

      if (line[0] != 'Y' && line[0] != 'N') 
      {      
        break; /* Something else but Y or N was read. Start over ... */
      }

      input_valid = 1;
    } while (0);

    if (input_valid == 0)
    {
      int c;

      do /* Flush rest of input. if any. */
      {
        c = getc(stdin);
      } while (EOF != c && '\n' != c);

      fprintf(stderr, "Invalid answer. Please enter 'Y' or 'N'.\n\n");
    }
    else
    {
      repeat = line[0];
    }
  } while ('\0' == repeat);

  printf("The user entered: '%c'\n", repeat); /* Will only print either Y or N. */

  return EXIT_SUCCESS;
}

答案 2 :(得分:0)

首先fflush(stdin);没有任何意义,除非在微软的世界中。

然后,scanf系列函数返回一个值,该值是成功解码的输入令牌的数量,并且应该始终控制返回值。并且应谨慎使用%c,因为它可以返回缓冲区中剩余的空白字符(空格或换行符),而%s仅返回可打印字符。有了这些评论,您的代码可能会成为:

repeat = '\0';
do
{
    char dummy[2], inp[2];
    printf("Do you want to try again? (Y/N): ");
    // fflush(stdin);                              
    if (1 == scanf("%1s%1s", inp,dummy) repeat = toupper(inp[0]);
    if (repeat != 'Y' && repeat != 'N')         
        printf("Invalid answer. Please enter 'Y' or 'N'.\n\n");

} while (repeat != 'N' && repeat != 'Y');