【问题标题】:character array overflowing by sprintfsprintf 溢出的字符数组
【发布时间】:2015-07-07 03:59:29
【问题描述】:

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

sprintf(array,"%f\0",floatvar); 

我正在 LCD 上写字符数组。

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

【问题讨论】:

  • 在字符串文字中写入\0 实际上是有正当理由的(例如WinAPI 的文件对话框过滤器字符串)。这不是其中之一。

标签: c arrays embedded printf


【解决方案1】:

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 字节缓冲区。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    相关资源
    最近更新 更多