C语言 在do while / for循环中使用sprintf()时出现分段错误



我使用sprintf - sscanf组合来四舍五入浮点小数,我是这样做的

float rounding(float number)
{
char* rounded_number;
float rounded;
sprintf(rounded_number, "%.2e", rounded_number);
sscanf(rounded_number, "%e", &rounded);
return rounded;
}

在循环外调用一次,在循环内调用一次。在任何循环之外尝试都会得到预期的结果,但是调用

for (int j = 1; j < 101; j++)
printf("%f", rounding( 1.0 / ((float) j)));

给出一个分段错误。

谁能解释一下?谢谢。

您的sprintf调用有未定义的行为,因为目标指针未初始化,到sprintf试图写入内存中的一些随机位置,很可能导致分段错误。

此外,您传递rounded_number而不是number作为%.2e的参数,这是另一种未定义的行为。

您应该使用snprintf并传递一个本地数组:

float rounding(float number) {
char buf[32];
snprintf(buf, sizeof buf, "%.2e", number);
sscanf(buf, "%e", &number);
return number;
}
但是请注意,在许多情况下,四舍五入的数字并不表示带有2位小数的精确值。浮点类型使用的二进制编码不能准确地表示大多数小数:只有10.50.25的整数倍才能准确地表示。

最新更新