【问题标题】:snprintf of unsigned long appending a comma无符号长的 snprintf 附加逗号
【发布时间】:2012-02-03 09:47:48
【问题描述】:

我尝试将unsigned long 转换为字符串,并在其末尾附加一个逗号。编译并运行您可以在下面找到的测试代码时,我得到以下输出:

"1234," "1234"
"1234"

测试代码为:

#include <cstdio>
#include <iostream>

int main () {

    unsigned long c = 1234;
    char ch[50];
    char ch1[50];

    sprintf(ch, "%lu,", c);
    std::cout << "\"" << ch << "\"" << " \"" << c << "\"" << std::endl;

    snprintf(ch1, 5, "%s", ch); 
    std::cout << "\"" << ch1 << "\"" << std::endl;

    return 1;
}

据我了解,ch 的长度应为 5,4 位数字加 1 的逗号。

我是否错过了终止字符的额外加一?

干杯!

【问题讨论】:

    标签: c++ c printf


    【解决方案1】:

    传递给snprintf 的大小包括终止空字符。虽然没有打印出来,但还是会占用缓冲区的空间。

    您应该改为传递strlen(ch) + 1。或者更好的是,只需 sizeof(ch1) 就足够了,因为您希望在填充缓冲区之前容纳整个结果。

    还要确保目标缓冲区始终具有足够的大小,等于或大于您传递给snprintf 的大小。在您的特定情况下,它几乎不会发生,但总的来说,您应该牢记这一点。

    【讨论】:

      【解决方案2】:

      来自Linux manual page

      函数 snprintf() 和 vsnprintf() 最多将 size 个字节(包括尾随空字节 ('\0'))写入 str。

      所以是的,你也应该有 6 的长度来获取逗号。

      【讨论】:

        【解决方案3】:

        C++ 方式:

        #include <string>
        
        unsigned long int c = 1234;
        
        std::string s = "\"" + std::to_string(c) + ",\"";
        std::string t = '"' +  std::to_string(c) + ',' + '"'; // alternative
        

        【讨论】:

        • 编译我得到:error: ‘to_string’ is not a member of ‘std’
        • @ezdazuzena:这需要现代编译器(支持 C++11)。在 GCC 中,说-std=c++0x;据我所知,MSVC10 支持这一点。
        • 感谢您的提示。我将另一个答案标记为正确,因为问题是关于 snprintf 的。任何,谢谢你的教训!
        【解决方案4】:

        正如您所写,您错过了终止字符的额外空格。

        函数 snprintf() 和 vsnprintf() 最多写入 size 个字节 (包括终止的空字节('\0'))到str。

        【讨论】:

          【解决方案5】:

          正如一些人指出的那样,您需要为空终止符包含足够的空间。

          检查从 snprintf 返回的结果是否与您认为的一样,总是值得的。

          最后,我推荐使用 snprintf(buffer, sizeof(buffer), etc, etc)

          如果第二个参数恰好大于您的实际可用空间,您不太可能得到令人尴尬的结果。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-30
            • 2014-02-22
            • 1970-01-01
            • 1970-01-01
            • 2016-05-22
            • 1970-01-01
            • 2013-03-19
            • 1970-01-01
            相关资源
            最近更新 更多