c - 为什么这会创建两个输入而不是一个

标签 c

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 != '=');





}

最佳答案

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

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

scanf(" %c", &answer);

此外,确保您确实成功读取某些内容也是一个很好的做法,特别是当未能读取某些内容意味着将其保留为未初始化并稍后尝试读取时(未定义行为的另一个示例)。因此,请检查 scanf 的返回值,该值应与您提供的转换说明符的数量相匹配:

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

关于c - 为什么这会创建两个输入而不是一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58295706/

相关文章:

c - 如何从字符串重建原始 BLOB 值?

c++ - gcc 是否有 pragma 来定义文件类型/编译器?

c - c中的unions( union 的内存存储模式)

c - linux 和 osx 中不同的 realloc 行为

c - 如何多次使用没有头保护的 .h 文件

c - 如何将执行命令的结果从服务器发送到客户端?

c++ - 哪些 C 功能受 C++ 功能影响/源自 C++ 功能?

c - 如何使用 VBA 在 Excel 16 for Mac 中打印 C BSTR?

c++ - 在此范围内未声明“无限”

C 段错误(核心转储)