2012-04-01 54 views
3
printf("%d.%d.%d", year, month, day); 

我也能這樣做,但沒有印刷,像水木清華生成字符串作爲printf函數

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

或者一些其他簡單的方法來做到這一點?

+1

哪個版本的C++的?在Visual C++中,例如'CString.Format' ...... – 2012-04-01 13:16:40

+0

@MrLister謝謝,這很有幫助。爲了將CString轉換爲char *,可以使用CString :: GetBuffer()。 – 2012-04-01 13:33:06

回答

5

用標準C有asprintf(),這將分配內存來保存生成的字符串:

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

(處理省略錯誤)

既然你已經標記了C++,你可能想使用C++解決方案。

+1

錯誤處理爲「如果asprintf'返回」-1「,而不是格式化字符串的長度,則失敗。」 – 2012-04-01 13:45:46

+1

我不會稱之爲「普通C」,「asprintf」不是標準功能。 – cnicutar 2012-04-01 13:47:31

+0

標準是什麼BSD :)沒有認真,「純C」的意思是「不C++」,是的,IIRC你需要定義Linux上的_GNU_SOURCE(實際上是glibc)來得到它。 – 2012-04-01 13:49:48

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;您也應該查看該功能,因爲它對於格式化輸出來說是相當基礎的,如果您真的認爲需要,可以直接使用它。

+0

請注意,這是在C++ 11中添加的,因此可能不支持所有編譯器和/或默認構建標誌。 – natevw 2013-11-01 05:15:29

1

有一個format功能,看起來像各種實現的:

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

所以你的例子是:

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

一種可能的實現如下所示。

Boost有一個format library,工作方式稍有不同。它假定你喜歡cincout,之流:

​​

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

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兩次,第一次沒有獲得格式化字符串長度的緩衝區,然後分配字符串對象的容量,然後再次調用該字符串。這樣可以避免兩次分配內存,但必須對格式化的字符串進行兩次傳遞。

0

在C語言中使用sprintf功能從stdio.h頭文件。

char buffer[100]; 
sprintf(buffer,"%d.%d.%d", year, month, day); 

有關更多信息,請參閱here

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" 
}