首页 > 解决方案 > 为什么这会创建两个输入而不是一个

问题描述

https://i.imgur.com/FLxF9sP.png

如上面的链接所示,我必须输入 '<' 两次而不是一次,这是为什么呢?此外,似乎第一个输入被忽略了,但第二个“<”是程序识别的那个。

即使没有循环也会发生同样的事情。

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

int main(){

  int randomGen, upper, lower, end, newRandomGen;
  char answer;

  upper = 100;
  lower = 1;
  end = 1;

  do {

   srand(time(0));
   randomGen = rand()%(upper + lower);
   printf("%d\n", randomGen);
   scanf("%s\n", &answer);

  }while(answer != '=');





}

标签: c

解决方案


scanf格式字符串中的空格,例如\nin "%c\n",尝试匹配任意数量的空格,并且scanf不知道没有空格可以跳过,直到遇到不是空格的内容(例如您键入的第二个字符)或结尾输入。您向它提供=\n,它会填充%c并等待空格结束。然后你提供另一个=scanf返回。第二次,这个角色可以是任何东西,它仍然可以工作。

跳过前导空格(并为一个字符使用正确的说明符,%c如前所述):

scanf(" %c", &answer);

此外,确保您确实成功地阅读了某些内容是一种很好的做法,尤其是当无法阅读某些内容时,意味着将其保留为未初始化并稍后尝试阅读(未定义行为的另一个示例)。所以 checkscanf的返回值应该与您提供的转换说明符的数量相匹配:

if (scanf(" %c", &answer) != 1) {
    return EXIT_FAILURE;
}

推荐阅读