2016-04-12 11 views
0

Ich kam auf dieses Time Conversion-Programm in HackerRank, ich war überrascht, wie das Programm in HackerRank kompiliert wird (oder könnte mein Missverständnis von C sein).C Programm Time Conversion

#include <stdio.h> 

int main() { 
    int hh, mm, ss; 
    char tt[2]; 
    scanf("%d:%d:%d%s", &hh, &mm, &ss, tt); 
    printf("%d\n", hh); 
    if(strcmp(tt, "PM") == 0 && hh != 12) hh += 12; 
    if(strcmp(tt, "AM") == 0 && hh == 12) hh = 0; 
    printf("%02d:%02d:%02d", hh, mm, ss); 
    return 0; 
} 

Das obige Programm, wenn ich in meinem Computer lief, MinGW 32-Bit-GCC Compiler verwendet wurde, wurde ich den Wert von hh als Null zu bekommen.

enter image description here

Fein, dachte ich Compiler Problem sein könnte und lief den Code in IDEONE, gleiche Ergebnisse.

enter image description here

Aber wenn ich diesen gleichen Code mit HackerRank lief, wurden alle Testfälle bestanden, ich habe keine Ahnung, wie diese Arbeit hier ist?

enter image description here

Ich bin in diesem Stadium verwirrt, mache ich das richtig?

+2

Sie haben eine 1-Zeichen-Abkürzung für 'char tt [2];' Sie haben das Zeichen * nul-termining * vergessen. Du brauchst mindestens 'char tt [3] =" ";" AM "oder" PM "zu halten (die Initialisierung ist nur eine gute Übung) –

+0

@ DavidC.Rankin, wie gibt Variable hh Null zurück, nur wegen char Zeiger hat einen kürzeren Speicherplatz? und wie läuft es auf hackerrank? – cs1193

+2

Es läuft schlecht. Sie rufen undefiniertes Verhalten auf. – Lundin

Antwort

0

Mit den vorgenommenen Änderungen Raum zu ermöglichen, in tt den nul abbreche Charakter gerecht zu werden, auch die Code-Funktionen in Umrechnungen auf militärische Zeit. Wenn Sie tt initialisieren, um alle Elemente während der Deklaration/Definition auf Null zu setzen, haben Sie sichergestellt, dass tt ohne Ende ist, wenn AM oder PM hinzugefügt werden. z.B.

#include <stdio.h> 
#include <string.h> 

int main (void) { 

    int hh, mm, ss; 
    char tt[3] = ""; 

    printf (" enter time in HH:MM:SS AM/PM: "); 
    if (scanf ("%d:%d:%d %[^\n]%*c", &hh, &mm, &ss, tt) != 4) { 
     fprintf (stderr, "error: invalid read of time.\n"); 
    } 

    hh = (strcmp (tt, "PM") == 0 && hh != 12) ? hh + 12 : hh; 
    if (strcmp (tt, "AM") == 0 && hh == 12) hh = 0; 
    printf (" %02d:%02d:%02d\n\n", hh, mm, ss); 

    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/tmread 
enter time in HH:MM:SS AM/PM: 11:59:04 PM 
23:59:04 

es über suchen und lassen Sie mich wissen, wenn Sie Fragen haben.

+0

scanf mit "% s" ist gefährlich, da es die Stringlänge nicht einschränkt. Sehen Sie hier https://msdn.microsoft.com/en-us/library/xdb9w69d.aspx oder andere Orte, um dieses Problem im Allgemeinen zu vermeiden. –

+0

Einverstanden, es kann immer mit "% [^ \ n]% * c" ersetzt werden, was wahrscheinlich die bessere Lösung ist. Es war ursprünglich als '% s' übrig geblieben, da es sich um' AM', 'PM' in einer Datei mit festem Format handelte. Es wurde vermieden, die Verwendung des * Zuweisungsunterdrückung * -Operators usw. zu diskutieren. –