2016-11-25 5 views
0

Ich bin neu in der C-Programmierung und hätte gerne Hilfe bei einer einfachen Aufgabe.C - time_t string representation

So habe ich diese Funktion:

char *time2str(time_t time) { 
    static_char *str_fmt = "%02d/%02d/%4d %02d:%02d"; 
    char *time_s = ""; 

    return time_s; 
} 

Was würde Ich mag ist in DD/MM/YYYY HH tun bekommen: MM die Zeit zu formatieren und speichern sie in Zeit_s variabel, so dass ich es zurückgeben kann. Mein Problem ist, dass ich nicht herausfinden kann, wie man die Zeichenkette formatiert und sie speichert, OHNE sie zu drucken. Alles, was ich bis jetzt gefunden habe, ist die Sprint-Methode, die tatsächlich die formatierte Zeichenfolge auch beim Speichern ausgibt, was ich nicht möchte.

In ein paar Worten, ich möchte nur die Zeit von time_t Zeit in dem Format, das ich erwähnte in time_s gespeichert.

Sorry, wenn ich nicht alles richtig erklärt habe, aber ich bin neu in C-Programmierung.

Antwort

0

Sie benötigen sprintf, die ähnlich zu printf ist, aber "druckt" das Ergebnis in einen Puffer und nicht auf dem Bildschirm.

den Zeiger auf einen statischen Puffer zurückkehrend:

char *time2str(time_t time) { 
    static_char *str_fmt = "%02d/%02d/%4d %02d:%02d"; 

    static char time_s[20];        // ugly, 20 is hopefully enough 
    //^static is important here, because we return a pointer to time_s 
    // and without static, the time_s buffer will no longer exist once the 
    // time2str function is finished 

    sprintf(time_s, str_fmt, time.....); 
    return time_s; 
} 

oder (besser), stellen wir einen Puffer (lang genug), wo die konvertierten Zeichenkette zu platzieren ist:

void time2str(time_t time, char *time_s) { 
    static_char *str_fmt = "%02d/%02d/%4d %02d:%02d"; 
    sprintf(time_s, str_fmt, time.....); 
    return time_s; 
} 
... 
char mytime[20];           // ugly, 20 is hopefully enough 
time2str(time, mytime); 
printf("mytime: %s\n, mytime); 

oder Die Funktion time2str gibt einen neu zugewiesenen Puffer zurück, der die konvertierte Zeichenfolge enthält. Dieser Puffer muss später mit free freigegeben werden.

char *time2str(time_t time) { 
    static_char *str_fmt = "%02d/%02d/%4d %02d:%02d"; 
    char *time_s = malloc(20);       // ugly, 20 is hopefully enough 
    sprintf(time_s, str_fmt, time.....); 
    return time_s; 
} 
... 
char *mytime = time2str(time); 
printf("mytime: %s\n, mytime); 
free(mytime); 

Das Ausfüllen der Argumente von sprintf bleibt dem Leser als Übung überlassen.

Haftungsausschluss: nicht getestet, kein Fehlerprüfcode, nur für Demonstrationszwecke.

+1

Allgemeinen immer mindestens 'snprintf' verwenden. Es ist * so * einfach, einen Pufferüberlauf mit 'sprintf' zu erzeugen! – hyde

0

Sie können strftime() verwenden, nachdem Sie Ihren time_t-Wert in struct tm konvertiert haben.

1

Die Funktion ctime nimmt eine time_t und gibt eine Zeichenfolge in einem festen Format aus. Wenn das für Ihre Aufgabe nicht ausreicht, sollten Sie strftime verwenden. Dies hat eine ganze Reihe von Formatspezifikationen, die zu Ihrem Bedarf passen sollten.

Es funktioniert auf struct tm, so würden Sie zuerst Ihre time_t zu, dass die Verwendung localtime oder gmtime konvertieren.

0

Im Allgemeinen

  1. Anruf time() die aktuelle Zeit in einen time_t variable
  2. Anruf zu bekommen localtime() einen Zeiger auf eine struct tm Struktur mit der Zeitinformation in getrennten Feldern
  3. Anruf zu bekommen strftime() zu Holen Sie sich das gewünschte Zeit-/Datumsformat.

vorschlagen den Manpages localtime() und für strftime() Lesen Sie alle Details

hier

zu bekommen, ist ein Beispielcode, in dem Sie benötigen würde die strftime() Format-String zu ändern, was Sie haben wollen, in das resultierende char-Array.

time_t  currentTimeSec = time(NULL); 
struct tm *tmStructptr; 
char  timeStamp[128]; 

tmStructptr = localtime(&currentTimeSec); 
strftime(timeStamp, sizeof(timeStamp), "YOUR FORMAT STRING" tmStructptr); 

Hinweis: nur den Tag der Woche zu extrahieren, die Format-String wäre: "% w"

Verwandte Themen