像printf函数一样构建字符串

时间:2012-04-01 13:13:14

标签: c++ string printf

printf("%d.%d.%d", year, month, day);

我可以这样做,但不打印,像

一样
char* date = "%d.%d.%d", year, month, day;

或者其他一些简单的方法可以做到这一点?

5 个答案:

答案 0 :(得分:6)

在普通c中有asprintf(),它将分配内存来保存结果字符串:

#include <stdio.h>
char *date;
asprintf(&date, "%d.%d.%d", year, month, day);

(省略错误处理)

由于您已经标记了C ++,因此您可能希望使用C ++解决方案。

答案 1 :(得分:2)

在C ++中:

#include <string>

std::string date = std::to_string(year) + '.' +
                   std::to_string(month) + '.' + std::to_string(day);

如果您需要基础char const *,请说date.c_str()

函数std::to_string在内部使用snprintf;你应该也可以查找那个函数,因为它对于格式化输出来说是相当基础的,如果你真的认为你需要它,你可以直接使用它。

答案 2 :(得分:1)

format函数的各种实现看起来像:

std::string format(const std::string& fmt, ...);

所以你的例子是:

std::string date = format("%d.%d.%d", year, month, day);

一种可能的实现如下所示。

Boost的format library有一点不同。它假设您喜欢cincout及其同类:

cout << boost::format("%1%.%2%.%3%") % year % month % day;

或者,如果你只想要一个字符串:

boost::format fmt("%1%.%2%.%3%");
fmt % year % month % day;
std::string date = fmt.str();

请注意,%标志不是您习惯使用的标志。

最后,如果你想要一个C字符串(char*)而不是C ++ string,你可以使用asprintf function

char* date; 
if(asprintf(&date, "%d.%d.%d", year, month, day) == -1)
{ /* couldn't make the string; format was bad or out of memory. */ }

您甚至可以使用vasprintf使自己的format函数返回C ++字符串:

std::string format(const char* fmt, ...)
{
    char* result = 0;
    va_list ap;
    va_start(ap, fmt);
    if(vasprintf(*result, fmt, ap) == -1)
        throw std::bad_alloc();
    va_end(ap);
    std::string str_result(result);
    free(result);
    return str_result;
}

这不是非常有效,但它确实有效。还有一种方法可以调用vsnprintf两次,第一种没有缓冲区来获取格式化的字符串长度,然后分配具有正确容量的字符串对象,然后第二次调用以获取字符串。这样可以避免分配内存两次,但必须通过格式化的字符串进行两次传递。

答案 3 :(得分:1)

在C ++中,我编写了一个function来使用printf格式创建字符串。

Headerfile stringf.h

#ifndef STRINGF_H
#define STRINGF_H

#include <string>

template< typename... argv >
std::string stringf( const char* format, argv... args ) {
    const size_t SIZE = std::snprintf( NULL, 0, format, args... );

    std::string output;
    output.resize(SIZE+1);
    std::snprintf( &(output[0]), SIZE+1, format, args... );
    return std::move(output);
}

#endif

用法:

#include "stringf.h"

int main(){
    int year = 2020;
    int month = 12;
    int day = 20
    std::string date = stringf("%d.%d.%d", year, month, day);
    // date == "2020.12.20"
}

答案 4 :(得分:0)

在C语言中使用stdio.h头文件中的char buffer[100]; sprintf(buffer,"%d.%d.%d", year, month, day); 函数。

Received HTTP status code [401] with message "Invalid request token." when getting token credentials.

有关详细信息,请参阅here