printf("%d.%d.%d", year, month, day);
我也能这样做,但没有印刷,像水木清华生成字符串作为printf函数
char* date = "%d.%d.%d", year, month, day;
或者一些其他简单的方法来做到这一点?
printf("%d.%d.%d", year, month, day);
我也能这样做,但没有印刷,像水木清华生成字符串作为printf函数
char* date = "%d.%d.%d", year, month, day;
或者一些其他简单的方法来做到这一点?
用标准C有asprintf(),这将分配内存来保存生成的字符串:
#include <stdio.h>
char *date;
asprintf(&date, "%d.%d.%d", year, month, day);
(处理省略错误)
既然你已经标记了C++,你可能想使用C++解决方案。
错误处理为“如果asprintf'返回”-1“,而不是格式化字符串的长度,则失败。” – 2012-04-01 13:45:46
我不会称之为“普通C”,“asprintf”不是标准功能。 – cnicutar 2012-04-01 13:47:31
标准是什么BSD :)没有认真,“纯C”的意思是“不C++”,是的,IIRC你需要定义Linux上的_GNU_SOURCE(实际上是glibc)来得到它。 – 2012-04-01 13:49:48
在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
;您也应该查看该功能,因为它对于格式化输出来说是相当基础的,如果您真的认为需要,可以直接使用它。
请注意,这是在C++ 11中添加的,因此可能不支持所有编译器和/或默认构建标志。 – natevw 2013-11-01 05:15:29
有一个format
功能,看起来像各种实现的:
std::string format(const std::string& fmt, ...);
所以你的例子是:
std::string date = format("%d.%d.%d", year, month, day);
一种可能的实现如下所示。
Boost有一个format library,工作方式稍有不同。它假定你喜欢cin
,cout
,之流:
或者,如果你只是想要一个字符串:
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
两次,第一次没有获得格式化字符串长度的缓冲区,然后分配字符串对象的容量,然后再次调用该字符串。这样可以避免两次分配内存,但必须对格式化的字符串进行两次传递。
在C语言中使用sprintf
功能从stdio.h
头文件。
char buffer[100];
sprintf(buffer,"%d.%d.%d", year, month, day);
有关更多信息,请参阅here。
在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"
}
哪个版本的C++的?在Visual C++中,例如'CString.Format' ...... – 2012-04-01 13:16:40
@MrLister谢谢,这很有帮助。为了将CString转换为char *,可以使用CString :: GetBuffer()。 – 2012-04-01 13:33:06