2015-05-14 7 views
5

Mein Programm fordert den Benutzer auf, eine Zeichenfolge anzugeben, die in ein Array von Zeichen kopiert wird. Dann kopiert das Programm mit einer for-Schleife einfach die Elemente des ersten Arrays in das zweite Array.Warum werden Strings zweimal gedruckt, wenn printf in C verwendet wird?

int main() { 

    int i; 
    char string1[4], string2[4]; 

    // Get the first string 
    printf("Insert your string: "); 
    scanf("%s", string1); 

    // Copy the values into the second array 
    for (i = 0; i < 4; i++) { 
     string2[i] = string1[i]; 
    } 

    // Print the second string 
    printf("%s", string2); 
    return 0; 
} 

Allerdings, wenn ich die Zeichenfolge mit der printf() Funktion drucken die String zweimal gedruckt wird.

sagen Let ich Eingabe das Wort

Bars

Der Ausgang

wird

barsbars

Warum ist das passiert?

Antwort

6

4-Element Char-Array ist nicht genug für 4-Zeichen-Strings. Sie benötigen eine weitere für das abschließende Zeichen '\0'.

4

Warum?

TL; DR Antwort: undefined behaviour.

Um zu erklären, hier das Problem, mit einer Eingabeanordnung wie string1[4] definiert ist, (4 Elemente only), wird eine Eingabezeichenfolge wie bars den zugewiesenen Speicherbereich overruning (im Versuch, den Abschluß \0 zu speichern), die wiederum ruft undefined behaviour auf.

Sie sollten immer darauf achten, Ihre Eingangspufferlänge, wie für eine Eingangs Array von string1[4], Ihre scanf() wie

scanf("%3s", string1); 
1
char bString []= {'s','t','r','i','n','g'};    
printf("bString:%s\n", bString); 

Ausgabe aussehen sollte:

bstring: stringstring

Lösung: Immer inkl ude Endzeichen

char bString []= {'s','t','r','i','n','g','\0'};  

Oder einfach schreiben:

char bString [] = "string"; 
Verwandte Themen