0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * reverse(char *string);
int main(int argc, char *argv[])
{
    char array[10];
    array[0] = 'a';
    array[1] = 'b';
    array[2] = 'c';
    array[3] = 'd';
    array[4] = 'e';
    printf("1%s\n",array);
    char *p = reverse(array);
    printf("4%s\n",p);
    printf("5%s\n",array);
}

char * reverse(char *string)
{
    int size = strlen(string);
    char reversed[size];
    int i;
    int j = 0;
    for(i = size-1; i >= 0; i--)
    {
        reversed[j] = string[i];
        j++;
    }
    printf("2%s\n",reversed);
    string = reversed;
    printf("3%s\n",string);
    return reversed;
}

このコードは基本的に、値の配列を初期化し、これらの値を逆にするメソッドに渡します。

私はCのポインターと配列に慣れていないので、これがタスクを実行するための最良の方法であるかどうかはわかりません。

しかし、本当の問題はこれです:

誰もがこの行で理由を理解できますか

printf("4%s\n",p);

前の「4」を削除すると、次のようになります。

printf("%s\n",p);

行がまったく印刷されませんか?

4

3 に答える 3

7

関数内のローカル変数(reversed)へのポインタを返しています。reverse質問は実際には次のようになりますWhy did it work in the first place?

このコードstring = reversed;はポインターのみをコピーし、ポインターのローカルコピーもコピーするため、関数の外部では効果がありません。

文字列を逆にするために追加のメモリは必要ありません-これはインプレースで行うことができます。

于 2013-01-16T14:53:06.383 に答える
1

Cの文字列は、ヌル文字で終了する必要があります。nullで終了していない文字列でstrlenを使用しています。

于 2013-01-16T14:54:37.473 に答える
0

さらに、コードに深刻な問題があるため、非常に幸運な人です\0。文字列の最後に記号を追加するのを忘れています。

UPD:主な問題はコード行にありchar reversed[size];ます。これは通常のローカル変数であり、自動期間があります。つまり、関数が呼び出されると存在し、関数が戻ると消えます(このリンクを参照)

次のように変更する必要があります。

char *reversed = malloc((size+1)*sizeof(char));

UPD-2:別のバグ修正は次のようになります:

array[5] = '\0';1)他のすべての配列初期化行の後に追加します

reversed[j] = '\0';2)後に追加for...loop

for(i = size-1; i >= 0; i--)
{
    reversed[j] = string[i];
    j++;
}
reversed[j] = '\0';

UPD-3:しかし、一般的には、適切な方法で文字列をより正確に初期化します。

char array[10] = "abcde";
于 2013-01-16T14:55:12.217 に答える