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

时间:2015-01-15 23:23:17

标签: c scanf

我有一个程序,用户输入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”或更少的东西,它可以工作)

2 个答案:

答案 0 :(得分:4)

你可以写:

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

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

if

答案 1 :(得分:3)

接受回答后

“如果我只输入”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] == '\0') {
    // Success - Not too much, not too little, just right
    break; 
  }
}