2016-12-22 9 views
-1

C言語の文字列を反転する以下のコードでは、res [i] = * p--を使用して文字列にアクセスすると動作します。C:文字列の逆:res [i] = * p--;しかし、* res ++ = * p--; does not

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;} 

しかし、私が代わりに次を使用する場合 -

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;} 

を私は戻り値として空の文字列を取得します。

そしてres ++ = * p--;内部エラーで()ループの結果を得るために:

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--; 
     ^

、私はそれは非常に基本的な質問ですけど、誰かが私はこれを理解する助けてくださいすることができますか? ありがとうございます。

+2

関数の最後に 'res'は文字列の先頭を指しません。 – BLUEPIXY

+0

resはポインタ、* resまたはres [i]は値です。 – cpatricio

+1

"私は以下の代わりに - * res ++ = * p--を使用していると言っています;戻り文字列として空の文字列を取得します。関数全体を表示する必要があります。 – Stuart

答えて

1

resを変更しているため、文字列の末尾のアドレスが返されるためです。割り当てたメモリブロックのアドレスを返す必要があります。

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

ありがとう。それは理にかなっている。 –

+0

ありがとうございます。それは理にかなっている。しかし、私はまだres ++ = * p--がうまく動作せず、エラーを投げる理由を理解できません。 –

+0

@BLUEPIXYありがとう、私は今問題を見る。 –

関連する問題