2011-01-10 6 views
1

Ich bin Anfänger zu programmieren. Ich habe dieses kleine Programm geschrieben, um eine Zeichenfolge umzukehren. Aber wenn ich versuche, eine Zeichenfolge umzukehren, die weniger als 5 Zeichen lang ist, gibt es eine falsche Ausgabe. Ich kann nicht finden, was falsch ist.Etwas ist falsch mit diesem C-Code, um die Zeichenfolge umzukehren, aber ich weiß nicht was? bitte helfe

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
char test[50]; 
char rtest[50]; 
int i, j=0; 
printf("Enter string : "); 
scanf("%s", test); 
int max = strlen(test) - 1; 
for (i = max; i>=0; i--) 
{ 
    rtest[j] = test[i]; 
    j++; 
} 
printf("Reversal is : %s\n", rtest); 

return 0; 
} 

Antwort

5

Sie sind nicht die umgekehrte Zeichenfolge mit 0 enden (alle Strings in C sind 0-terminierte)

In diesem Fall wird die printf wird (wahrscheinlich in Abhängigkeit von dem unitialized Inhalt der RTEST Array) erstellt einen Pufferüberlauf.

Fügen Sie eine rtest[max+1]=0; nach der for-Schleife und alles sollte in Ordnung sein. Andernfalls können Sie char rtest[50] = {0} deklarieren (dies initialisiert das ganze Array mit 0s).

+0

aber warum funktioniert es OK, wenn String-Länge 5 oder mehr Zeichen ist? – hsinxh

+3

@Harbhag: Der Inhalt des Arrays 'rtest' ist unbestimmt - und es ist ein ** undefiniertes Verhalten **, das versucht, auf sie zuzugreifen (bevor Werte zugewiesen werden). Manchmal scheint es zu funktionieren - oft nicht. –

+0

Danke für die Antwort, es funktioniert jetzt korrekt. – hsinxh

1
void reverse(char* str) 
{ 
int len = strlen(str); 
for (int i = 0; i < len/2; ++i) { 
    char tmp = str[i]; 
    str[i] = str[len - 1 - i]; 
    str[len - 1 - i] = tmp; 
} 
} 
+1

-1. Das OP fragt nach Problemen in seiner eigenen Lösung. Er bat nicht um eine andere Lösung, die er kopieren und einfügen konnte. Und ich würde eine -2 geben, wenn ich es ohne irgendeinen zusätzlichen Kommentar veröffentlichen könnte. – Secure

+0

andere Beiträge klar das Problem bei seiner Umsetzung erklärt. Ich denke nur, dass er es verdient hat, eine andere Lösung zu suchen, die weniger Ressourcen verbraucht. –

+0

Es gibt kein Problem damit. Aber vielleicht solltest du das sagen, anstatt einen Code in den Raum zu werfen. Ein Anfänger könnte darüber stolpern, wenn er ohne Kontext da herumliegt. ;) – Secure

2

rtest ist unitalisiert.

Sie sollten rtest [j] = '\ 0'; nach der for-Schleife zu sagen, wo die Zeichenfolge endet