2017-05-01 1 views
2

Ich arbeite an einer Funktion, wo ich Parameter von Benutzern erhalte, herausfinden, was der erste Tag von dieser Woche ist und dann die ganze Woche für den Benutzer ausdrucken.Wie bekomme ich den ersten Wochentag von den angegebenen Parametern und drucke die ganze Woche von Montag bis Sonntag?

Das ist, was ich bisher getan habe:

#include <time.h> 
#include <stdio.h> 

void week(int day, int month, int year) 
{ 
struct tm time; 
char buffer[80]; 
int i; 

time.tm_year = year - 1900; 
time.tm_mon = month - 1; 
time.tm_mday = day; 
time_t rightTime = mktime(&time); 
time.tm_wday = rightTime; 

time.tm_wday = mktime(&time); 

for (i = 0; i < 7; i++) 
{ 
    strftime(buffer, sizeof(buffer), "%A %d. %B %Y\n",&time); 
    printf(buffer); 

    time.tm_mday = time.tm_mday + 1; 
    time.tm_wday = time.tm_wday + 1; 
}  

} 

dann mit dem Code zu experimentieren begann ich ersten Tag der Woche zu bekommen. Ich habe versucht, den ersten Tag der Woche zu ermitteln, indem ich den Wochentag und dann minus alle Tage bis zum Montag festlege. Dann kann ich die gesamte Woche von Montag bis Sonntag drucken. Beispiel wenn wday Samstag (6):

if(rightTime == 6) 
{ 
    time.tm_mday = time.tm_mday - 6; 
} 
time.tm_wday = mktime(&time); 

Es ist noch nicht die richtige Art und Weise fühlen, aber ich kann nicht herausfinden, wie man den ersten Tag dieser Woche gegeben, um herauszufinden, aktualisieren Sie alle Informationen, und dann drucken es für den Benutzer aus.

Recht ausgegeben, wenn Parameter für Tag, Monat und Jahr zum Beispiel 20 4 2017 wären:

Monday 17. April 2017 
Tuesday 18. April 2017 
Wednesday 19. April 2017 
Thursday 20. April 2017 
Friday 21. April 2017 
Saturday 22. April 2017 
Sunday 23. April 2017 

Alle Hilfe ist willkommen!

+0

Bitte setzen Sie sich nicht in die Gewohnheit Variablen als Format-String zugeben - verwenden 'printf ("% s", Puffer)' statt - das wird rette deine Haut eines Tages.(In diesem Fall können Sie den Zeilenumbruch aus der Zeichenfolge entfernen und einfach 'puts (puffern)', was ebenfalls sicher und wahrscheinlich effizienter ist.) –

Antwort

4

mktime() verwendet viele der Mitglieder in struct tm, so mktime() Aufruf ohne die Mitglieder Ergebnisse in undefinierten Verhalten (UB) einstellen.

// struct tm time; 
struct tm time = { 0 }; // set all fields to 0. 
...  
time.tm_year = year - 1900; 
time.tm_mon = month - 1; 
time.tm_mday = day; 
time_t rightTime = mktime(&time); 

Nach mktime(), das Tag-of-the-Woche Mitglied eingestellt.

int days_since_Sunday = time.tm_wday; // 0 - 6 

... wie am ersten Tag dieser Woche gegeben, um herauszufinden, aktualisieren Sie alle Informationen und es dann für Benutzer ausdrucken. ... drucke die ganze Woche von Montag bis Sonntag auf den Benutzer.

Um die Tage seit Montag zu finden, subtrahieren Sie 1, aber verwenden Sie Modulo-Mathe und vermeiden Sie negative Zahlen. % entspricht der klassischen Funktionalität von Modulo mit positiven Argumenten, aber differs mit negativen.

#define DaysPerWeek 7 
int days_since_Monday = (days_since_Sunday + DaysPerWeek - 1) % DaysPerWeek; 

die Woche zu drucken, mit dem angegebenen Datum beginnen und subtrahiert den Offset:

// Move date back to Monday 
time.tm_mday -= days_since_Monday; 

for (int d=0; d<DaysPerWeek; d++) { 
    mktime(&time); // adjust for end of month, year issues. 
    strftime(buffer, sizeof buffer, "%A %d. %B %Y\n", &time); 
    printf("%s", buffer); 
    time.tm_mday++; // advance to tomorrow 
} 

Hinweis: time wie in struct tm time verwendet, ist in Ordnung, aber ein bisschen verwirrend gegeben ist der Standard Funktion time(). Überlegen Sie, einen anderen Namen zu verwenden. Vielleicht struct tm timestamp_ymd.

Robust Code würde Fehlerüberprüfung hinzufügen:

if (mktime(&time) == (time_t)-1) Handle_Error(); 
Verwandte Themen