试图让 scanf 只查看输入的前 n 个数字

Trying to get scanf to only look at first n number(s) of the input

我有一个程序,用户输入 3 个数字并计算二次公式。我唯一的问题是,当用户输入“1、2、3、4”时,我的程序无法按照我希望的方式运行。它所做的是像正常计算“1,2,3”,但在“4”之后再次尝试。我想告诉用户他们输入了无效的输入,但不确定如何输入。

下面是我的代码:

    printf("Please enter the coefficients a, b, c: ");
    num = scanf("%f, %f, %f", &a, &b, &c);

    if (num != 3) {
        printf("Invalid argument\n");
        break;
    }

我怎样才能意识到 4 个字符是错误的输入。 (注意:如果我只输入“1,2”或更少的值,它就会起作用)

你可以这样写:

if ( num != 3 || getchar() != '\n' )

如果您打算在循环中使用此代码(或者在此之后确实有任何其他输入),那么您可能想要为此 if 刷新 { } 内的缓冲区:

int ch; 
while ( (ch = getchar()) != '\n' && ch != EOF ) {}

接受答案后

"it works if I enter just "1,2" 或更小"。有疑问的:尝试输入“1,2,”(添加逗号)- 它只会坐在那里等待更多输入。解决方案是读取 ,然后对其进行解析以获得可接受性。

for (;;) {    
  printf("Please enter the coefficients a, b, c: ");
  char buf[100];
  if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOForIOerror();

  int n = 0;
  sscanf(buf, "%f ,%f ,%f %n", &a, &b, &c, &n);
  if (n > 0 && buf[n] == '[=10=]') {
    // Success - Not too much, not too little, just right
    break; 
  }
}