首页 > 解决方案 > Scanf 在循环中为标准输入取两个值,但只需要一个结束循环

问题描述

因此,此代码的要求之一是它从同一行扫描分数和名称,因此我将它们放在同一个 scanf 中,并且输入 q 将中断循环并停止输入。问题是当输入没有数字的 Q 时,它会在停止循环之前进行另一个输入。我可以做任何修复来完成这项工作吗?

     while(entered_name[0] != 'Q' && entered_name[1] != 0)
     {
        
        scanf(" %s %d", entered_name, &new_score);
        if(entered_name[0] == 'q')
        {
            entered_name[0] = toupper(entered_name[0]);
        }
     }

标签: cscanf

解决方案


您应该使用输入行,fgets()因为scanf()一旦实际输入与格式字符串中的预期不匹配,就会卡住。

然后第二次,您可以使用 分析获得的行sscanf()

结果给出了%成功提取的数量(从左侧开始),因此您可以区分在此行上提供了一个或两个信息的情况。

/**
  gcc -std=c99 -o prog_c prog_c.c \
      -pedantic -Wall -Wextra -Wconversion \
      -Wc++-compat -Wwrite-strings -Wold-style-definition -Wvla \
      -g -O0 -UNDEBUG -fsanitize=address,undefined
**/

#include <stdio.h>
#include <string.h>

int
main(void)
{
  char entered_name[100]="";
  int new_score=-1;
  while((strcmp(entered_name, "Q")!=0)&&
        (strcmp(entered_name, "q")!=0))
  {
    char line[100];
    if(fgets(line, sizeof(line), stdin)==NULL)
    {
      break; // cannot read standard input any more
    }
    int r=sscanf(line, "%s %d", entered_name, &new_score);
    switch(r) // number of % extracted
    {
      case 1:
      {
        printf("entered name only: %s\n", entered_name);
        break;
      }
      case 2:
      {
        printf("entered name and score: %s %d\n", entered_name, new_score);
        break;
      }
      default:
      {
        printf("sorry, I didn't understand.\n");
      }
    }
  }
  return 0;
}

推荐阅读