2016-09-13 2 views
-2

I C durch folgenden Code am Üben:Aussagen aus while-Schleife nicht ausgeführt

char* streverse(char* s){ 
    int len=strlen(s); 
    int i=0; int j=len; 
    char* r; 

    while(i<j){ 
     s[i]=s[j]; 
     i++; j--; 
    } 
    printf("\nReverse string is %s",s); 
    return r; 
} 

Aber die printf führt nie. Wenn ich das entferne:

printf führt aus. Das ist seltsam, weil die while-Schleife sowieso unabhängig von der obigen Zuweisung endet. Gibt es Anhaltspunkte dafür, dass printf bei obiger Zuweisung nicht ausgeführt wird?

EDIT:

Durch die printf Unterschrift jetzt korrigieren druckt.

+2

Undefiniertes Verhalten. –

+4

Sie wissen, dass 's [strlen (s)]' immer der Terminator ist? Also rate mal, was in der allerersten Iteration der Schleife passiert ... –

+2

Auch das Schreiben in 'stdout' (was' printf' tut) löscht den Puffer (d. H. Schreibt tatsächlich) auf Newline. Das Drucken der einzigen neuen Zeile * zuerst * in einem 'printf'-Aufruf macht also keinen Sinn. –

Antwort

5

Sie sollten j auf len-1 als eine erste Änderung festlegen, da Sie ansonsten auf s außerhalb seines Inhalts zugreifen. Genauer gesagt wird s[len] ein NUL (oder Zeichen \0) sein, da so Strings in C gespeichert werden. Und es wird mit dem ersten Element von s getauscht werden, was es effektiv zu einer Zeichenfolge leerer Länge macht Zeichenfolge.

Zweitens sollte das Format nur printf("\nReverse string is %s", s);

Auch Sie r etwas zuweisen sollte es vor der Rückkehr (nach s wahrscheinlich?), Andernfalls es wird initialisiert werden, um nur Kauderwelsch und verursachen Probleme auf der ganzen Linie, wenn Sie versuchen, es als Zeiger zu verwenden.

+2

_s [len] 'wird ein' NULL' _... nicht wirklich sein. 'NULL' ist kein' Null-Terminator'. – LPs

+0

Tatsächlich ist 's [len]' nicht außerhalb seines * zugewiesenen * Speichers. Das abschließende ''\ 0'' wird ebenfalls zugewiesen, aber nicht von' strlen() 'gezählt. –

+0

Yup, Sie haben Recht. Ich habe die Änderungen in der Antwort vorgenommen, um die Realität widerzuspiegeln –

3

Sie übergeben %s als Formatbezeichner, der ein Zeichenfolgenargument erwartet, aber den Ganzzahlwert i als Wert übergibt.