2016-08-30 1 views
0
#include <stdio.h> 
#include <string.h> 

main() 
{ 
    int h, m; 
    char designator[] = ""; 

    printf("Please enter the hours: "); 
    scanf("%d", &h); 
    if (h < 0 || h > 23) 
    { 
     printf("Please enter a proper time!"); 
    } 

    else 
    { 
     printf("Please enter the minutes: "); 
     scanf("%d", &m); 
     if (m > 59 || m < 0) 
     { 
      printf("Please enter a proper time!"); 
     } 

     else if (h == 0 && m == 0) 
     { 
      strcpy(designator, "midnight"); 
     } 
     else if (h == 12 && m == 0) 
     { 
      strcpy(designator, "noon"); 
     } 
     else if (h == 0) 
     { 
      strcpy(designator, "am"); 
      h = h + 12; 
     } 
     else if (h < 12) 
     { 
      strcpy(designator, "am"); 
     } 
     else if (h > 12) 
     { 
      strcpy(designator, "pm"); 
      h = h - 12; 
     } 
     printf("The time is: %d:%d %s", h, m, designator); 
    } 
} 

Hallo dort! Wenn ich diesen Code ausführe, erhalte ich eine Ausgabe, die sehr unerwartet ist. Die Variablen (insbesondere m) sollen sich nicht ändern. Sie werden mit scanf() als Eingabe verwendet, aber ich habe nicht die Absicht, sie zu ändern. Ich nehme an, die Variablen des Problems oder mit dem, wenn die haben aber wirklich habe ich keine Ahnung, was das Problem mit meinem Code lautet:/Inhalt von Variablen ändern sich unerwartet?

Dies ist, was in der Befehlszeile angezeigt:

Bitte geben Sie die Stunden: 23
Bitte geben Sie die Minuten: 15
Es ist: 11: 109 Uhr

ich habe versucht, zu ermitteln, wo die „109“ herkommt, aber ich habe keine Ahnung, was auch immer. Ich bin sehr neu in C, also gibt es wahrscheinlich einige Dinge, die mir noch nicht klar sind, aber ich bin sehr bereit, von ihnen zu lernen.

Antwort

3

Wenn Sie sizeof designator tun, werden Sie sehen, dass es eine Größe von nur ein Byte hat. Sein Inhalt ist das einzelne Zeichen '\0' (der String-Terminator). Das liegt an der Art, wie Sie es initialisieren.

Wenn Sie ein Array ohne explizite Größe erstellen, leitet der Compiler die Größe von den Daten ab, mit denen Sie das Array initialisieren. Da Sie es mit einer leeren Zeichenfolge initialisieren, ist eine leere Zeichenfolge enthalten, und die ist die Größe, die es enthalten wird.

Aus diesem Grund schreiben Sie außerhalb der Grenzen des Arrays, und das führt zu undefined Verhalten.

Sie müssen eine Größe des Arrays explizit festlegen, die groß genug ist, um die größte Zeichenfolge zu enthalten, die Sie darin kopieren.

z.

char designator[128] = ""; 
+0

Und gibt es einen Grund, warum die Variable designator die anderen Variablen beeinflusst? Oder ist es nur das undefinierte Verhalten, das du dort erwähnt hast? – NugNugs

+0

@NugNugs Der Grund dafür ist, dass alle lokalen Variablen auf dem CPU-Core-Stack gespeichert sind und nur so viel Platz einnehmen, wie vom Compiler festgelegt. Das bedeutet, wenn Sie außerhalb der Grenzen des Arrays schreiben, überschreiben Sie möglicherweise den Speicher des Stapels, in dem die anderen Variablen gespeichert sind. –

0

Der Wert der numerischen Variablen könnte sich ändern, wie Sie Bytes an einen Ort (designator) ohne ausreichenden Raum zu kopieren sind, die ihnen überschreiben können.

Verwandte Themen