3

sprintf()私はで機能を実現する方法を探していましたが、 sprintfのようなstd::stringフォーマットstd::stringから良い答えを見つけました。ただし、から返されたポインタに直接書き込むため、これはややハッキーです。そこで、withとを使用して再実装しました。string.c_str()char *malloc()realloc()

std::string string_format(const char * format, ...) {
    size_t size;
    size_t n;
    va_list args;
    char * buffer;
    std::string str;

    size = 100;
    buffer = malloc(size);
    for (;;) {
        va_start(args, format);
        n = vsnprintf(buffer, size, format, args);
        va_end(args);
        if (n > -1) {
            if (n < size) {
                size = n;
                break;
            }
            size = n + 1;
        } else {
            size *= 2;
        }
        buffer = realloc(buffer, size);
    }

    str = std::string(buffer, size);

    free(buffer);
    return str;
}

私は私がただできることを知っています:

str = std::string(buffer);

しかし、それは本質的にしなければならないでしょうstrlen(buffer)。私はそれを少し良くすることができます:

str = std::string(buffer, size);

しかしstring.swap()、内部バッファをコピーする代わりにスワップすることで、より効率的に使用できますか?

str.swap(std::string(buffer, size));

これを行うためのより良い方法はありますか?

4

1 に答える 1

12

使用するだけstr.assign(buffer, size);

于 2013-02-08T07:28:27.570 に答える