0

検索しましたが、文字列を逆にする関数が配置されている場所しか見つかりません。これが私がこれまでに持っているものです:

char* reverseString(char* string)
{
    int i, j;
    char reversed[sizeof(string)];
    j = strlen(string);

    for (i = strlen(string); i >= 0; i--)
    {
        reversed[j - i] = string[i];
    }
    return reversed;
}

ただし、それはローカル変数である反転の問題にぶつかるため、それへのポインターを返すとスローされます

warning: function returns address of local variable [enabled by default]
4

4 に答える 4

2

まず、式は文字列の長さではなく、ポインターsizeof(string)のサイズを返します。そのためにも使う。また、ta.speot.is で指摘されているように、終端文字を 1 文字追加するだけでなく、その終端文字を逆文字列に追加する必要があります。strlen(string)'\0'

あなたの問題に関しては、変数reversedはスタックに保存され、関数がそのメモリ領域を返すと、もう利用できなくなります。そのメモリをegでヒープに割り当てるmalloc(そして後でそのメモリを解放するfree)か、変数を作成する必要がありますstaticが、その場合、マルチスレッドプログラムでは使用できません。

于 2012-11-07T08:30:25.443 に答える
2

メモリを動的に割り当てることができます。

char* reverseString(char* string)
{
    int i;
    int j = strlen(string);
    char *reversed = malloc(j + 1);
    ...

この場合、呼び出し元は、返された割り当てられたバッファーを free() することを覚えておく必要があります。

または、逆の文字列を保持するのに十分な大きさのバッファを渡すように呼び出し元を設定することもできます。

char* reverseString(char* string, char *reversed)
{
     int i, j;
     j = strlen(string);

     for (i = strlen(string); i >= 0; i--)
     {
 ...

また、現在のコードでは:char reversed[sizeof(string)];が間違っていることに注意してください。この関数内でstringは a のみであるchar*ため、この char* が指す文字列の長さではなく、sizeof(string)a のサイズを示します。char*

于 2012-11-07T08:33:39.240 に答える
1

malloc を使用して反転文字列にスペースを割り当てるか、呼び出し元に新しい文字列用のスペースを提供させることができます。後者は、通常、メモリ リークを引き起こすプログラミング エラーのリスクを軽減します。

void reverseString(char *reversed, char *string)
{
    int i, j;
    j = strlen(string);

    for (i = strlen(string) - 1; i >= 0; i--)
    {
        reversed[i] = string[j-i];
    }
    reversed[j] = 0;  /* Don't forget to nul-terminate the reversed string */
}
于 2012-11-07T08:33:59.360 に答える
0

関数に割り当てたくない場合は、ターゲットバッファを指定してから返します。その場合の責任は、リバースがソースに収まるのに十分な大きさであるという呼び出し元にあります。

char* reverseString(char* source, char* reversed) {...}

はい、sizeof は文字列サイズをチェックする正しい方法ではありません。 strlen() を使用してください

于 2012-11-07T08:34:30.357 に答える