2016-04-14 11 views
0

ich eine einfache Lösung für die Brian Kernighan geschrieben haben ‚s "Die Programmiersprache C" Übung 1-19, dass die eine umkehrt Zeichenkette. Die reverse(char[]) Funktion ist wie unten und alles ist in Ordnung;Postfix ++ Operator Nicht Behaving wie erwartet Innerhalb While Bedingung

void reverse(char src[]) 
{ 
    int len = 0; 
    while(src[len] != '\0') 
     len++; 

    for(int i = 0; i < len/2; i++) 
    { 
     char temp = src[i]; 
     src[i] = src[len - 1 - i]; 
     src[len - 1 - i] = temp; 
    } 
} 

Wenn ich jedoch die Postfix Inkrement verwenden (++) -Operator innerhalb der while-Schleife, scheitert die Funktion;

void reverse(char src[]) 
{ 
    int len = 0; 
    while(src[len++] != '\0')  // this fails 
     ; 

    for(int i = 0; i < len/2; i++) 
    { 
     char temp = src[i]; 
     src[i] = src[len - 1 - i]; 
     src[len - 1 - i] = temp; 
    } 
} 

Der einzige Unterschied ist, anstatt die variable len innerhalb der while-Schleife Inkrementieren I eine Postfix ++ Operator verwendet, daß die das Verhalten als Erwartung sein sollte, „Verwenden Sie den alten Wert für die bedingte Scheck, nach dem Abschluss inkrementieren Sie es ".

Warum funktioniert es nicht wie erwartet, wo mache ich falsch? Ich kompiliere es unter Windows 10 Mingw/gcc Compiler. Hier ist der gesamte Testcode;

Testcode

#include <stdio.h> 

#define STR_NUM  5 
#define STR_SIZE 20 

void reverse(char[]); // declaration 

int main() 
{ 
    char str[STR_NUM][STR_SIZE] = 
    { 
     { "A"  }, 
     { "AB" }, 
     { "ABC" }, 
     { "ABCD" }, 
     { "ABCDE" } 
    }; 

    for(int i = 0; i < STR_NUM; i++) 
     reverse(str[i]); 

    for(int i = 0; i < STR_NUM; i++) 
     printf("%s\n", str[i]); 

    return 0; 
} 

// this is working 
void reverse(char src[]) 
{ 
    int len = 0; 
    while(src[len] != '\0') 
     len++; 

    for(int i = 0; i < len/2; i++) 
    { 
     char temp = src[i]; 
     src[i] = src[len - 1 - i]; 
     src[len - 1 - i] = temp; 
    } 
} 

// this is failing 
/* 
void reverse(char src[]) 
{ 
    int len = 0; 
    while(src[len++] != '\0')  // this fails 
     ; 

    for(int i = 0; i < len/2; i++) 
    { 
     char temp = src[i]; 
     src[i] = src[len - 1 - i]; 
     src[len - 1 - i] = temp; 
    } 
} 
*/ 
+4

Verwenden Sie einen Debugger, um zu sehen, was 'len' als endet. Es spielt immer noch nach den Regeln, aber es wird erhöht * obwohl * Sie sind am Ende, wenn Ihre Zeichenfolge. – usr2564301

+1

Rad Lexus hat Recht. Für einen leeren String führt der Code 'while (src [len ++]! = '\ 0');' das ist nicht wahr, weil 'src [0] == '\ 0''. Danach wird 'len' wegen' len ++ '1 sein. Ihre Zeichenfolge mit einer Länge von 0 wird als eine Länge von 1 betrachtet. –

+1

Beginnen Sie mit 'len == -1' und verwenden Sie' while (src [++ len]) '. – EOF

Antwort

5

Der Postfix Inkrementoperator gibt den ursprünglichen Wert und wird um eins erhöht.

while(src[len] != '\0') 
    len++; 

In der Arbeitsversion wird die while-Schleife beenden, wenn src[len] ein \0 ist. Wenn die while-Schleifen-Testbedingung fehlschlägt, wird die Anweisung innerhalb der Schleife nicht ausgeführt. Nach der Schleife enthält len einen Wert wie src[len] == '\0'.

while (src[len++] != '\0'); 

In Ihrer modifizierten Version, wenn der letzte Test len vorgeformten wird, wird ein weiteres Mal erhöht. Nach der Schleife enthält len einen Wert, so dass src[len] eins nach dem Ende des Arrays ist.

Die Schleife for geht jedoch davon aus, dass len die Zeichenfolge Länge ist, so dass Sie einen Fehler von eins nach dem anderen haben.

Verwandte Themen