【问题标题】:C Skipped Operation [duplicate]C跳过的操作[重复]
【发布时间】:2013-12-22 21:00:36
【问题描述】:

我正在尝试制作一个基本的 C 控制台应用程序计算器。然而,当我执行它时,会跳过第二个 scanf 命令,而是运行第三个命令。这是一个问题,因为这里我需要获取用户 +、-、* 或 / 的操作。我该如何阻止这种情况发生?

float num1;
char sign;
float num2;
float total;
printf("~~~ Calculator ~~~\n");
printf("Please enter the first number: ");
scanf("%f", &num1);//Get value of num1 from user

printf("\nNow please enter the operation , either +, -, *, or / : ");
scanf("%c", &sign);//Get value of sign from user 

printf("\n\nFinaly enter the second number: ");
scanf("%f", &num2);

编辑:实际上,在尝试了各种建议之后,它在 %c 之前缝合了一个空格,这是解决问题的正确方法和最干净的方法。感谢您的帮助。

【问题讨论】:

  • 第二个scanf没有被跳过。想一想:第一个 scanf 扫描“%f”,其中不包括您键入的换行符。第二个 scanf 扫描“%c”,它当然应该读取换行符。对于这种输入,我推荐使用 fgets + sscanf。
  • 这是复制的,天知道有多少问题。问题是找到一个好的标签作为副本。我在“相关”列表中看到了 5 个可能的竞争者,但它们看起来都不是一个好的选择。

标签: c


【解决方案1】:

在 %c 之前放置一个空白字符,这样它会像这样消耗换行符:

scanf(" %c", &sign);//Get value of sign from user

【讨论】:

  • 当我这样做时,控制台一直在等待输入,并没有像我希望的那样输出下一行文本
  • @Mikey 这应该有效。您是否希望 scanf(" %c", &sign) 在键入“+”之类的字符后立即返回?
【解决方案2】:

点击回车后,第一个scanf 消耗实际数字并离开\n。后者在下一个scanf消费。

scanf("%f\n", &order)

这样做是为了使用您输入的\n


正如@JonathanLeffler 所提到的,最好在下一行使用" %c"(注意空格)来使用换行符。

【讨论】:

  • 与其说是“跳过换行符”,不如说是“将换行符留在输入中以供下一个操作读取”。而且(我应该早点说过),最好的解决方法可能是使用" %c" 来读取下一个不是空格的字符。如果用户要输入,将\n 放在格式字符串的末尾真的很讨厌,因为在用户输入不是空格的字符之前输入不会结束。
  • @JonathanLeffler 谢谢。已编辑。
【解决方案3】:

程序要求输入第一个数字后,您输入一个数字,然后按回车键。所以数字存储在变量 num1 中。但是新行字符'\n' 仍在缓冲区中,您需要在执行第二个scanf 之前清除缓冲区否则signe 变量将接受'\n' 作为输入,因为它是一个字符并且不会提示输入。

在要求输入char之前,您应该始终清除缓冲区

int c;
do {
    c = getchar(); // clearing the buffer
} while (c!='\n' && c!=EOF);
printf("\nNow please enter the operation , either +, -, *, or / : ");
scanf("%c", &sign);//Get value of sign from user

现在应该可以了

【讨论】:

  • stdin 关闭并且getchar() forevermore 返回EOF 时,会出现while(getchar()!='\n'); 的问题。一个人永远不会离开循环。
  • 好多了,除了c 必须是int
【解决方案4】:

实际上,这是因为程序的标准输入流中还有一个值。 一个简单的解决方案是使用:

修复:不要使用 -> fflush(stdin);

使用 scanf("%f\n")... 使用换行符...

在第二次调用scanf之前...

最好的!

【讨论】:

  • fflush (...) 对于输入流未定义(对于其中,stdin 为一)。
  • 谢谢,以前没注意过这个。
  • 收拾烂摊子很辛苦。 Windows 和 Linux 都定义了 fflush(stdin) 的行为,并且(奇迹的奇迹)它执行同样合理的操作,但 C 标准和 POSIX 都没有定义行为。标准很棒,但有一些警告。阅读您的系统的手册页。
猜你喜欢
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
相关资源
最近更新 更多