代码之家  ›  专栏  ›  技术社区  ›  Sasha

sprintf和char[]与string

c c++
  •  1
  • Sasha  · 技术社区  · 15 年前

    const char * 一个函数。在传递之前,我通常需要从一些变量构建它。我无法决定哪种方法更优雅,总体上更好:

    • sprintf 生成最终变量并将其传递给函数。
    • 初始化字符串 s s.c_str() .


    亲:快。

    使用字符串的缺点:我不需要担心内存管理,易于构建。 专家:慢点。

    我的第二个问题是:通常如何从其他变量字符串构建完整的字符串?

    7 回复  |  直到 15 年前
        1
  •  14
  •   Timo Geusch    15 年前

    除非它对性能至关重要,否则我倾向于使用std::stringstream从其组件构建字符串,然后使用c_str()生成字符串。这是安全的,因为这样缓冲区溢出的可能性并不大,而且通常足够快。

        2
  •  10
  •   Johannes Schaub - litb    15 年前

    这听起来像是赫伯·萨特那篇优秀文章的一个例子 The String Formatters of Manor Farm .

    记录在案:我自己用 std::ostringstream oss.str().c_str() .

        3
  •  4
  •   Mark Ransom    15 年前

    一次由于缓冲区太短而导致的崩溃将抵消sprintf带来的所有速度节省。我不相信它会更快。即使是这样,这种差异是否足以让人担心?

        4
  •  2
  •   Kristopher Johnson    15 年前

    我几乎总是用 string stringstream sprintf 而其他老式的C库调用也太容易出错。

    把格式数据写成串 -样式函数超过 弦流 它使在运行时使用不同格式的字符串变得容易,从而达到国际化的目的。但你一定要用 snprintf 或者其他“更安全”的变种。

        5
  •  2
  •   Michael Kristofik    15 年前

    当谈到C++和优雅时,我倾向于遵循两条规则:

    1. 说出你的意思。
    2. 先分析,后优化。

    std::string s = s1 + s2 + s3 + s4;
    foo(s.c_str());
    

    为了“说出你的意思”,我伸手去拿 operator + . 使用 std::stringstream (一连串的弦乐)也很不错,但我不会马上再去找另一个 #include char 手工排列。

    在表现方面,我猜是 可能是最慢的组合琴弦的方法。但即使是一个缓慢的方法也可能足够快。

        6
  •  0
  •   Imagist    15 年前

    “过早的优化是万恶之源。”—努特

    换句话说,去安全,惯用的C++方式。当(如果)速度成为一个问题时,应该修复它,而不是之前,特别是如果之前修复速度会使代码更容易出错。

    至于你的第二个问题:向上看 ropes .

        7
  •  -1
  •   qrdl    15 年前

    asprintf() ,自动分配足够大的字符串。

    man asprintf

    更普遍的方法-先打电话 fprintf() 为了只获取返回的长度而不使用流,然后分配字符串并打印到它,如下所示:

    FILE *stream = tmpfile();
    char *string;
    
    string = malloc(fprintf(stream, format, param)+1);
    sprintf(string, format, param);