字符数组溢出sprintf

时间:2015-07-07 03:59:30

标签: c arrays embedded printf

我正在使用char数组[6]; 我正在使用sprintf将float变量转换为字符串,如下所示。

fitcsvm

我在LCD上写字符数组。

问题是我的数组大小只有6个字节,但它正在打印" 00000.00000" 11字节的数据。数组大小限制为6个字节。但是在这种情况下阵列如何溢出?

1 个答案:

答案 0 :(得分:2)

sprintf函数期望您提供足够大的缓冲区来保存其所有输出。否则,您的代码会导致未定义的行为。

您的代码也不会产生00000.00000;如果值介于01之间,则输出将以0.开头。也许您在实际代码中使用了不同的格式字符串。

使用%f时,无法仅通过格式字符串修饰符来约束输出。为安全起见,您可以使用snprintf

snprintf(array, 6, "%f", floatvar);

如果您的系统没有snprintf,那么我建议您下载vsnprintf的免费软件。

作为最后的手段,您可以使用sprintf进行大量检查:

if ( floatvar < 0.f || floatvar >= 1.f )
    exit.....;

sprintf(array, 6, "%.3f", floatvar);

.3表示小数点后最多显示3个字符;并且因为我们进行了范围检查,这意味着开始将是0.,总共5个输出字符加上空终止符。

为安全起见,我建议暂时输出到大缓冲区,使用strlen检查写入的内容,然后复制到6字节缓冲区,如果它写得正确的话。

NB。 "%f\0"很奇怪;字符串文字是字符串,因此它们已经以'\0'结尾。 "%f\0"以两个空终止符结束。