printf("%d.%d.%d", year, month, day);
我可以这样做,但不打印,像
一样char* date = "%d.%d.%d", year, month, day;
或者其他一些简单的方法可以做到这一点?
答案 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有一点不同。它假设您喜欢cin
,cout
及其同类:
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。