【问题标题】:snprintf for Windows CE用于 Windows CE 的 snprintf
【发布时间】:2014-10-02 09:29:46
【问题描述】:

我的程序在多个平台上运行。其中,Windows CE。目前,sprintf 被广泛使用,这会导致缓冲区溢出等问题。我想用调用 snprintf 来替换这些问题。对于Visual Studio,我发现了这个问题,解决了win32部分的问题:

snprintf and Visual Studio 2010

但我无法让它在 Windows CE 上工作,因为函数 _vsnprintf_s_vscprintf 以及常量 _TUNCATE 不可用。有人知道在 Windows CE 上复制 snprintf (linux) 行为的方法吗?

【问题讨论】:

标签: c visual-studio printf windows-ce


【解决方案1】:

到目前为止,我已经完成了以下功能:

int my_snprintf(char* str, size_t size, const char* format, ...)
{
    int len = 0;
    va_list ap;

    if (size == 0)
    {
        return 0;
    }

    va_start(ap, format);
    len = _vsnprintf(str, size, format, ap);
    va_end(ap);

    if (len < 0 || len >= size)
    {
        len = size - 1;
    }

    if (size > 0)
    {
        str[size - 1] = '\0';
    }

    return len;
}

初步测试看起来不错,它甚至可以为 WinCE 编译。非常感谢任何反馈

【讨论】:

  • 目前看起来不错。只是提到它:您知道snprintf 不能修复错误代码吗?无论哪种方式,您都需要重新编写,您必须测试 snprintf 的返回值以查看是否有足够的空间可用,如果没有,请重新分配缓冲区(或任何适合您的情况)。
  • 是的,我知道——这将是调试代码的下一步。现在的主要目的是避免一些由溢出引起的神秘崩溃
  • The main purpose now is to avoid some mysterious crashes caused by overflows - 我不认为你会修复你的错误,它只会隐藏真正的根本问题。 snprintf 将防止缓冲区溢出,但如果您的代码逻辑需要更大的数据并且缓冲区太小,那么它仍然无法正常工作。
  • 是的,没关系。这些类型的错误比缓冲区覆盖引起的错误更容易跟踪 - 可能会在或多或少随机的地方弹出..
  • 注意:if (size &gt; 0)的第二次测试不需要。
【解决方案2】:

我认为,您可以使用 Microsoft 特定的 printf_s 函数。我不确定它是否 100% 兼容,并且我认为它不允许缓冲区在大小为 0 时为空,但它可能足以满足您的要求并且......我没有 VS2010 来确认 printf_s 是存在于 Windows CE 版本中。

【讨论】:

    【解决方案3】:

    在 Windows CE 下是 _snprintf:

    http://msdn.microsoft.com/en-us/library/ms861145.aspx

    但其行为与标准略有不同,请在此处阅读:Is snprintf() ALWAYS null terminating?

    【讨论】:

    • 是的,这就是这些兼容性问题的起点——我应该在问题中提到这一点.. :)
    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2010-11-28
    相关资源
    最近更新 更多