我正在使用char数组[6]; 我正在使用sprintf将float变量转换为字符串,如下所示。
fitcsvm
我在LCD上写字符数组。
问题是我的数组大小只有6个字节,但它正在打印" 00000.00000" 11字节的数据。数组大小限制为6个字节。但是在这种情况下阵列如何溢出?
答案 0 :(得分:2)
sprintf
函数期望您提供足够大的缓冲区来保存其所有输出。否则,您的代码会导致未定义的行为。
您的代码也不会产生00000.00000
;如果值介于0
和1
之间,则输出将以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"
以两个空终止符结束。