2017-04-22 1 views
0

Ich bin gebeten, ein Programm zu machen, um das aktuelle Datum des Systems mit Hilfe der Bibliotheksfunktion getdate anzuzeigen, getdate füllt die Datumsstruktur * datep mit dem aktuellen Datum des Systems. Die vordefinierte Datumsstruktur in Turbo C++ ist wie folgt.datumsstruktur in turbo C++

Funktion getdate hat Deklaration in Header-Datei DOS.H wie folgt.

void gatdate(struct date *datep); 

Als GETDATE im Datumsstruktur * datep füllt mit dem aktuellen Datum des Systems, ich brauche eine Struktur Variable vom Typ struct Datums zu machen, ruft die GETDATE Funktion und übergibt die Adresse der Variable als GETDATE tatsächliches Argument, danach sollte der Wert dieser Strukturvariable das aktuelle Datum des Systems anzeigen. Das Strukturdatum hat die Zeichenvariable da_day als Mitglied, um den Tag des aktuellen Datums des Systems zu speichern.

  • Hier meine Frage, wie es möglich ist, Tage zu speichern (von 1-28/29/30/31 in der Regel) des Monats in einer Zeichenvariable?

  • Auch das Drucken des Wertes der Strukturvariablen wie unten
    gibt das aktuelle Datum des Systems nicht korrekt.

    printf("year/day/month is %d/%c/%c",a.da_year,da_day,da_mon); /* a is the structure variable of the type struct date */ 
    

    während die folgende Erklärung das korrekte Datum angibt.

    printf("year/day/month is %d/%d/%d",a.da_year,da_day,da_mon); 
    

    Warum ist es so?

+0

Markieren Sie dies als C++, wenn Sie C++ verwenden. Nicht C –

+0

** Verwenden Sie TurboC++ nicht in * 2017 ***. Verwenden Sie einen [C++ 11] (https://en.wikipedia.org/wiki/C%2B%2B11) konformen kostenlosen Software-Compiler (zB recent [GCC] (http://gcc.gnu.org/) oder [Clang] (http://clang.llvm.org/) ...). TurboC++ wird Ihnen veraltete Gewohnheiten beibringen (und einige veraltete Versionen von C++, die es heute nicht wert sind, gelernt zu werden). –

+0

BTW, in C++ würden Sie bevorzugen, [stream] (http://en.cppreference.com/w/cpp/io/basic_ostream) Ausgabe, nicht 'printf' –

Antwort

2

Hier meine Frage ist, wie ist es möglich, Tage zu speichern (1-28/29/30/31 in der Regel) des Monats in einer Zeichenvariable?

A char Variable, mit oder ohne Vorzeichen kann einen "Wert" im Bereich zwischen 0 bis 31 (Dezimalwert, sein pedantic) leicht halten, wie Datum verwendet werden.

Auch das Drucken des Wertes des Strukturvariable die Art und Weise unter nicht gibt richtig aktuelles Datum des Systems.

Ja, weil Sie den dezimal Wert nicht gedruckt werden, versucht man die entsprechende Zeichendarstellung zu drucken, die nicht zu erwarten ist. Wir sind nur an dem Dezimalwert interessiert, daher wäre %d der erwartete Konvertierungsspezifizierer.


Um dies näher auszuführen, für variadische Funktionen wie printf() unterliegen die angegebenen Argumente Standardargument Förderungnote, die die mitgelieferte char macht int gefördert werden, die für %d Konvertierungsspezifizierer eine perfekte Passform ist.

auch im Zusammenhang, unter Angabe der C11, Kapitel §7.21.6.1,

d,i

Das int Argument Dezimalzahl mit Vorzeichen im Stil umgewandelt wird [-] dddd. [....]

c

Wenn kein l Längenmodifizierer vorhanden ist, wird das Argument zu einer intunsigned char umgewandelt, und das resultierende Zeichen geschrieben wird. [....]


Hinweis:

C11 Zitiert, Kapitel §6.5.2.2

[....] Die Ellipsen-Notation in einem Funktionsprototyp declarator Ursachen Umwandlung des Argumenttyps, um nach dem letzten deklarierten Parameter zu stoppen. Das Standardargument Promotions wird für nachfolgende Argumente ausgeführt.

+0

Könnte erwähnen, dass, wenn Sie ein' char übergeben 'zu einer variadischen Funktion wie' printf', wird es implizit in ein 'int' umgewandelt (vgl." default argument promotions "im Standard), also ist"% d "doppelt passend. Tatsächlich ist '% c' aus genau diesem Grund praktisch immer ein Fehler. –

+0

@CodyGray Sehr wahr, wir haben '% hhd' oder'% hhu' und andere für 'char's. :) Ich füge das hinzu. –

+0

Wir machen das in modernen C++ - Compilern, aber ich konnte mich nicht erinnern, ob das in Turbo C++ existierte. (Wahrscheinlich weil ich viel zu jung bin, um jemals Turbo C++ zu benutzen.) –

Verwandte Themen