为什么这个float数组元素打印正确,但不是这个双数组元素?

时间:2017-03-09 03:06:01

标签: c

我正在学习C的基础知识。 我正在尝试将数据输入到数组中。经过一些试验和错误,我发现我可以做我需要使用浮点数组而不是双数组。

#include <stdio.h>
int main()
{
   float x[4]={2.2,3.3,4.4,5.5};
   scanf("%f",&x[3]);
   printf("%f",x[3]);
   return 0;
}

用户输入3会产生3.000000

但是在这个版本中:

#include <stdio.h>
int main()
{
   double x[4]={2.2,3.3,4.4,5.5};
   scanf("%f",&x[3]);
   printf("%f",x[3]);
   return 0;
}

用户输入3会产生5.500001

为什么会这样,以及如何正确输入值/打印出数组值?

1 个答案:

答案 0 :(得分:1)

首先,由于使用了不正确的memory trampling,您有format specifiers.首先,更正后的示例,更少&#34;噪音&#34;。

#include <stdio.h>

int main(void)
{
   double x = 5.5;
   scanf("%lf", &x);
   printf("%lf", x);
   return 0;
}

其次,您应该尝试避免scanf()一般用于字符串解析,并考虑逐行读取(即:fgets()或其他一些机制),然后编写解析器。本网站上存在大量关闭/欺骗问题,仅针对您的问题。另外,还有其他事项,like newlines being left in the input buffer.

最后,有三个好点:

  • David C. Rankin注意:使用gcc -Wall -Wextra来捕获所有编译器警告。如果您想强迫自己不允许任何警告,请附加-Werror
  • 了解如何使用gdb来调试程序。它很简单:使用调试符号进行编译,并通过gcc -O0 -ggdb配置调试模式(和零优化),然后gdb my_program_name;快乐!)。
  • 考虑在启用堆栈粉碎检测的情况下构建程序(gcc -fstack-protector-strong)。它会故意&#34;崩溃&#34;如果你做了一些非常错误的事情,就像你的例子中发生的事情一样,提早(断言)你的节目。它可以让您在测试期间而不是在生产中发现严重的内存践踏问题。现在不是一个了解valgrind,strace,ptrace,helgrind,perf等的好时机,而你还是在这里。

祝你好运!