繁体   English   中英

验证特定字符的用户输入

[英]Validating User Input for Specific Char

我正在创建一个运行纸牌游戏的程序,我需要获得王牌服装(H,D,S,C)并验证用户输入。 我可以捕获j或3之类的无效内容,但是如果它们输入HH或SS(无效),则认为它是正确的。

我试过使用strlen看看是否还有更多的字符,我想也许我可以检查一下缓冲区中是否还有其他垃圾,但是不知道该怎么做。 我也尝试做类似while(scanf(" %c", &trump) != 1事情,但这while(scanf(" %c", &trump) != 1 ,我只用c编写了一个星期。

我的翻车功能

char getTrump(){
  char trump;
  char ch;

  char correct = 1;
  while(correct == 1){
    printf("Please choose a trump suit (H, D, S, C): ");
    scanf(" %c", &trump);
    while(getchar() != '\n');

    if(isValidSuit(trump) == 1){
      printf("Correct\n");
      return trump;
      correct = 0;
    }else{
      printf("Please enter a valid suit.\n");
    }
  }
}

以及是否有帮助我的isValidSuit函数(必须具有char作为参数)

int isValidSuit(char c){
  char suits[] = {'H', 'D', 'S', 'C'};

  for(int i = 0; i < 4; i++){
    if(suits[i] == c){
      return 1;
    }
  }

  return 0;
}

运行它的一个例子:

Please choose a trump suit (H, D, S, C): j
Please enter a valid suit.
Please choose a trump suit (H, D, S, C): HH
Correct

如果他们输入HH或SS(无效),则认为它是正确的。

当然,因为当您输入HHscanf(" %c", &trump); 读取trump变量中输入的第一个H ,然后将第二个输入H保留在输入缓冲区中。 之后, while循环中的getchar()读取剩余的用户输入。 isValidSuit()找到H作为trump变量的值,并返回1 因此,您将获得HHSS输入Correct的信息。

要解决此问题,您可以检查输入是否超过1字符并且该字符不是换行符,而不是提示用户输入有效输入,例如:

char getTrump(){
    char trump;
    char ch;

    char correct = 1;
    while(correct == 1){
        printf("Please choose a trump suit (H, D, S, C): ");
        scanf(" %c", &trump);
        if (getchar() != '\n') {
            while(getchar() != '\n');
            printf("Please enter a valid suit.\n");
            continue;
        }
    .......
    .......

我认为使用fgets作为用户输入会更好(总而言之)。 scanf的比较存在问题。 在这种情况下,fgets从stdin(键盘)读取输入。 现在,很容易删除任何换行符并测试长度。

char getTrump(){
  const int suitSize = 12;
  char suit[suitSize];
  bool correct = false;
  memset(suit, 0, suitSize);

  do
  {
    printf("Please choose a trump suit (H, D, S, C): ");
    fgets(suit, suitSize-1, stdin);

    if (suit[strlen(suit)-1] == '\n')
        suit[strlen(suit)-1] = '\0';

    // check input length only one char
    if (strlen(suit) == 1 && isValidSuit(*suit) == 1){
        printf("Correct\n");
        correct = true;
    }
    else{
        printf("Please enter a valid suit.\n");
    }
  } while (!correct);
  return *suit;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM