【问题标题】:How do I prevent buffer overflow converting a double to char?如何防止缓冲区溢出将双精度转换为字符?
【发布时间】:2010-05-12 00:10:37
【问题描述】:

我正在将 double 转换为 char 字符串:

char txt[10];
double num;

num = 45.344322345

sprintf(txt, "%.1f", num);

并使用“.1f”将小数位截断到十分位。
即 - txt 包含 45.3

我通常在 sprintf 中使用精度来确保字符缓冲区不会溢出。 在不使用 snprintf 的情况下,我如何在此处截断小数点?

(即如果由于某种原因 num = 345694876345.3)

谢谢

EDIT 如果 num 是 > buffer 结果不再重要,只是不想崩溃。不确定在这种情况下什么最有意义。

EDIT2 我应该比标签更清楚,这是一个 C 程序。 我在 C 程序中使用 snprintf 时遇到问题。 I don't want to add any 3rd party libraries.

【问题讨论】:

  • 如果无法正确打印结果,您希望结果是什么?

标签: c arrays string


【解决方案1】:

使用snprintf(),它会告诉你有多少字节没有打印出来。通常,您应该将数组的大小设置为足够大以处理目标整数类型的最长字符串表示形式。如果事先不知道,请使用malloc()(或asprintf(),这是非标准的,但存在于许多平台上)。

编辑

snprintf() 如果格式超出给定缓冲区,将正常失败,它不会溢出。如果您不需要处理,那么只需使用它即可解决您的问题。我想不出你不想想要处理这个问题的例子,但话又说回来,我没有处理你正在处理的任何事情:)

【讨论】:

    【解决方案2】:

    为什么不让你的缓冲区足够大以容纳最大可能的双精度字符串表示形式?

    假设使用 IEEE 浮点算术标准的 64 位双精度数,尾数使用 52 位:2^52 = 4,503,599,627,370,500。所以我们需要 16 个字符来保存小数点前后的所有数字。 19 考虑小数点、符号字符和空终止符。

    我会使用至少 20 个字符的缓冲区大小,然后继续。

    如果您需要使用科学计数法打印双精度数,则需要为指数添加足够的空间。假设有一个 11 位有符号指数,那么指数的另外 4 个字符加上指数的符号和字母“E”。在那种情况下,我只会选择 30 个字符。

    【讨论】:

    • 我只要 40 岁就可以继续前进。除非它是一个数组,否则 40 个字节比您的时间便宜很多。但我也喜欢 snprintf。
    【解决方案3】:

    如果您绝对必须自己做,请在尝试转换之前计算数字中的位数:

    int whole = num;
    int wholeDigits = 0;
    do {
        ++wholeDigits;
    }
    while (whole /= 10);
    
    double fraction = num - (int) num;
    int decimallDigits = 0;
    while (fraction > 0) {
        ++decimalDigits;
        fraction *= 10;
        fraction = fraction - (int) fraction;
    }
    
    int totalLength = decimalDigits ? wholeDigits + decimalDigits + 1 : wholeDigits;
    

    在依靠它来防止崩溃之前,您可能应该验证这个临时代码是否像宣传的那样工作。正如其他人所说,我建议您使用snprintf 或类似的东西来代替我的代码。

    【讨论】:

      【解决方案4】:

      为什么要在没有snprintf 的情况下这样做?无论您的格式字符串是否包含双精度、另一个字符串或其他任何内容,您都应该使用snprintf,真的。据我所知,没有理由这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-30
        • 2011-02-17
        • 2023-03-27
        相关资源
        最近更新 更多