初学者问题/问题:Scanf无法在MacOS终端中正常工作

时间:2020-09-04 08:40:51

标签: c macos terminal scanf

首先,我想提一下我是编程的新手,我本周开始了第一门课程。但是,这个问题似乎很奇怪,这是我在C语言中计算三角形面积的代码:

#include <stdio.h>

int main(void) {

  double base, height;

  printf("Type the base of the triangle\n");
  scanf("%lf\n", &base);
  printf("Type the height of the triangle\n");
  scanf("%lf\n", &height);

  printf("Here is the area of the triangle: %.2lf\n", (base * height) / 2);

  return 0;
}

在我看来还不错,但是在终端机中,我得到了以下结果:

除非我键入另一个数字并按回车键,否则终端不会“让我”继续进行下一个扫描。我为height变量选择的值也没有关系,因为结果是(5 5)/ 2而不是(5 6)/ 2。它会忽略值“ 6”,而是使用我在“键入三角形的底角”下输入的第二个“ 5”。

有人知道这个问题可能是什么吗?我正在使用MacOS High Sierra,如果需要更多详细信息,请告诉我,我感谢能获得的任何帮助!

2 个答案:

答案 0 :(得分:2)

让我开始敦促您阅读本文,以了解为什么不应该使用scanf以及应该如何使用它,以防万一最终还是要使用它: http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html

现在,将\n放入scanf格式的字符串中并不意味着要换行,而是要读取和丢弃任意数量的空格字符。由于%lf已经舍弃了前导空格,因此无论如何格式字符串中都不需要显式空格。

在您的情况下,\n导致scanf读取字符,直到找到非空白字符为止,它可能需要读取另一行才能找到该非空白字符。这就是为什么在代码允许您继续操作之前,您被“强制”输入另一个数字(或任何非空白字符)的原因。此处的解决方法是仅使用%lf,而不使用\n

#include <stdio.h>

int main(void) {

  double base, height;

  printf("Type the base of the triangle\n");
  scanf("%lf", &base);
  printf("Type the height of the triangle\n");
  scanf("%lf", &height);

  printf("Here is the area of the triangle: %.2lf\n", (base * height) / 2);

  return 0;
}

但是,这种方法也有一些警告,正如我上面链接的文章会告诉您的。

答案 1 :(得分:0)

\n格式字符串上的scanf告诉scanf也获得换行符,但是由于换行符是空白的一部分,scanf会跳过它这意味着匹配第一个数字后,scanf会期待\n或非空白字符(由于忽略了换行符,因此匹配第二个scanf5会停止)

假设输入缓冲区为5\n\5\n\6\n,2 scanf解析输入相同的缓冲区(stdin),第一个在读取第一个输入5时停止,结果保存到base,第二个将在第一个停止的位置继续->表示第二个输入5将被读取到height,因此第三个输入6将被忽略( (可以使用任何非空白键来停止扫描仪)。结果将为(5*5)/2 = 12.5

相关问题