我正在学习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
为什么会这样,以及如何正确输入值/打印出数组值?
答案 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.
最后,有三个好点:
gcc -Wall -Wextra
来捕获所有编译器警告。如果您想强迫自己不允许任何警告,请附加-Werror
。gdb
来调试程序。它很简单:使用调试符号进行编译,并通过gcc -O0 -ggdb
配置调试模式(和零优化),然后gdb my_program_name
;快乐!)。gcc -fstack-protector-strong
)。它会故意&#34;崩溃&#34;如果你做了一些非常错误的事情,就像你的例子中发生的事情一样,提早(断言)你的节目。它可以让您在测试期间而不是在生产中发现严重的内存践踏问题。现在不是一个了解valgrind,strace,ptrace,helgrind,perf等的好时机,而你还是在这里。祝你好运!