2016-12-22 2 views
-1

Im folgenden Code, um eine Zeichenfolge in C-Sprache umzukehren, funktioniert es, wenn ich auf die Zeichenfolge mit dem Index zugreifen, res [i] = * p--;C: Umkehrung einer Zeichenkette: res [i] = * p--; funktioniert, aber * res ++ = * p--; nicht

char *reverseString(char * s){ 
int l = strlen(s); 
char *res = malloc(sizeof(s) + 1); 
char *p = s + l - 1; // point to the last letter 
int i = 0; 
for(;i < l; i++) 
    res[i] = *p--; 
return res;} 

Aber wenn ich folgendes stattdessen -

char *reverseString(char * s){ 
int l = strlen(s); 
char *res = malloc(sizeof(s) + 1); 
char *p = s + l - 1; // point to the last letter 
int i = 0; 
for(;i < l; i++) 
    *res++ = *p--; 
return res;} 

ich einen leeren String als Rückgabewert.

Und res ++ = * p--; innerhalb des für() Schleife führt zu einem Fehler:

char *reverseString(char * s){ 
int l = strlen(s); 
char *res = malloc(sizeof(s) + 1); 
char *p = s + l - 1; // point to the last letter 
int i = 0; 
for(;i < l; i++) 
    res++ = *p--; 
return res;} 

error: lvalue required as left operand of assignment 
    res++ = *p--; 
     ^

Ich weiß, es ist eine sehr grundlegende Frage, aber kann jemand bitte helfen Sie mir, dies zu verstehen? Danke.

+2

am Ende der Funktion 'res' zeigt nicht auf den Anfang der Zeichenfolge. – BLUEPIXY

+0

res ist der Zeiger, * res oder res [i] ist der Wert. – cpatricio

+1

Sprich "wenn ich stattdessen folgendes benutze - * res ++ = * p--; bekomme ich einen leeren String als Rückgabewert" ist nicht gut genug. Sie müssen die gesamte Funktion anzeigen. – Stuart

Antwort

1

Weil Sie res ändern und daher die Adresse des Endes des Zeichens zurückgeben. Sie müssen die Adresse des Speicherblocks zurückgeben, den Sie zugewiesen haben.

char *reverseString(char * s) 
{ 
    int l = strlen(s); 
    char *res = malloc(l + 1); //As suggested by BLUEPIXY. It will be optimal. 
    char *origAddr = res; //Store the original address of the memory block. 
    char *p = s + l - 1; // point to the last letter 
    int i = 0; 
    printf("Allocated addr: res[%p]\n", res); 
    for(;i < l; i++){ 
     *res++ = *p--; 
     printf("addr: res[%p]\n", res); 
    } 
    *res = '\0'; //As suggested by BLUEPIXY to terminate the string. 

    return origAddr; /* Return the original address. */ 
} 
+0

Danke. Das macht Sinn. –

+0

Danke. Das macht Sinn. Aber ich verstehe immer noch nicht, warum res ++ = * p-- wird nicht funktionieren und den Fehler werfen? –

+0

@BLUEPIXY Danke Ich sehe das Problem jetzt. –

Verwandte Themen