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

Kann ich das gleiche tun, aber ohne Druck, smth wieBuild-String als in printf Funktion

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

Oder vielleicht einige andere einfachen Möglichkeiten, das zu tun?

+1

Welche Version von C++? In Visual C++ haben Sie 'CString.Format' zum Beispiel ... –

+0

@MrLister Danke, das war hilfreich. Um CString in char * zu konvertieren, kann CString :: GetBuffer() verwendet werden. –

Antwort

5

Im Klar c gibt es asprintf(), die Speicher zuteilen wird, den resultierenden String zu halten:

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

(Fehlerbehandlung weggelassen)

Da Sie C markiert haben ++ Sie wahrscheinlich die C verwenden möchten ++ Lösungen.

+1

Fehler beim Behandeln, "wenn' asprintf' '-1' zurückgibt, anstatt der Länge der formatierten Zeichenfolge, ist es fehlgeschlagen." –

+1

Ich würde es nicht "plain C" nennen, "asprintf" ist keine Standardfunktion. – cnicutar

+0

Standard ist, was BSD hat :) Nein ernsthaft, "plain c" bedeutet "nicht C++", und ja, IIRC müssen Sie _GNU_SOURCE auf Linux (glibc tatsächlich) definieren, um es zu bekommen. –

2

In C++:

#include <string> 

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

Wenn Sie die char const * zugrunde liegen müssen, sagen date.c_str().

Die Funktion std::to_string verwendet intern snprintf; Sie sollten wahrscheinlich auch diese Funktion nachschlagen, da sie für die formatierte Ausgabe ziemlich grundlegend ist, und Sie können sie direkt verwenden, wenn Sie wirklich denken, dass Sie das brauchen.

+0

Beachten Sie, dass dies in C++ 11 hinzugefügt wurde, so dass es möglicherweise nicht von allen Compilern und/oder Standard-Build-Flags unterstützt wird. – natevw

1

Es gibt verschiedene Implementierungen einer format Funktion, wie etwas aussieht:

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

so Ihr Beispiel wäre:

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

Eine mögliche Implementierung ist unten dargestellt.

Boost hat eine format library, die ein wenig anders funktioniert. Es wird davon ausgegangen Sie cin, cout und Konsorten:

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

Oder, wenn Sie nur eine Zeichenfolge gesucht:

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

Beachten Sie, dass % Flags sind nicht die, die Sie gewohnt sind.

Schließlich, wenn Sie einen C-String (char*) anstelle eines C++ string wollen, könnten Sie die 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. */ } 

Sie sogar vasprintf verwenden könnten Ihre eigenen format Funktion, die einen C++ Zeichenfolge zu machen:

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

Dies ist nicht sehr effizient, aber es funktioniert. Es kann auch eine Möglichkeit geben, zweimal vsnprintf aufzurufen, die erste ohne Puffer, um die formatierte Zeichenfolgenlänge zu erhalten, dann das Zeichenfolgenobjekt mit der richtigen Kapazität zuzuweisen und dann die zweite Zeit aufzurufen, um die Zeichenfolge abzurufen. Dies vermeidet die doppelte Zuweisung des Speichers, muss jedoch zwei Durchläufe durch die formatierte Zeichenfolge durchführen.

0

Verwenden Sie in C Sprache sprintf Funktion von stdio.h Header-Datei.

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

Weitere Informationen finden Sie unter here.

1

In C++ schrieb ich eine function, um Zeichenfolgen im printf-Format zu erstellen.

Header 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 

Verbrauch:

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