1

reverser()cstring を逆にします (インプレースではありません)。99% の時間は機能しますが、一部の入力によって破損します。たとえば、aStr2[] に同じ文字で構成される文字列が割り当てられている場合、エラーが発生します。

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

char* reverser(const char *str);

int main()
{
    char aStr[] = "aaa";
    char aStr2[] = "cccccc";
    printf("%s %s", aStr, aStr2);
    char* tmp = reverser(aStr2);//tmp now has garbage
    printf("\n%s", tmp);
    printf(" %s", aStr2);
    return 0;
}


char* reverser(const char *str)
{
    char* revStr = (char*)malloc(strlen(str));
    int i;
    for(i = strlen(str)-1; i >= 0; i--)
{
        revStr[strlen(str)-1-i] = str[i];
}
    return revStr;
}

与える

aaa cccccc
cccccc9 cccccc
Process returned 0 (0x0)   execution time : 0.068 s
Press any key to continue

そこにあるべきではない 9 に注意してください。

4

3 に答える 3

2

あなたの問題は、逆の文字列に文字列ターミネータを入れていないことです。C のすべての文字列は、実際には によって報告されない 1 つの余分な文字でありstrlen、それが文字'\0'(または単純で単純なゼロ) です。これにより、文字列がいつ終了するかがすべての C 関数に通知されます。

したがって、呼び出しでこの余分なターミネータ文字にスペースを割り当てmalloc、文字列の最後の文字の後に追加する必要があります。

mallocコードには他にもいくつかの問題があります。1 つ目は、 の戻り値(またはを返す他の関数) をキャストしてはならないことですvoid *。もう1つは、割り当てたメモリを解放しないというメモリリークがあります。この最後の点は、ここにあるような小さなプログラムでは問題になりませんが、大規模で長時間実行されるプログラムでは問題になります。

于 2013-10-04T10:40:33.460 に答える
2

この malloc を strlen(str) + 1 に変更し、'\0' の場合は 1 を加えます

char* revStr = (char*)malloc(strlen(str) + 1);

そして for ループの後

revStr[strlen(str)+1] = '\0';
于 2013-10-04T10:44:41.080 に答える
0

逆文字列を null で終了していません。revStr[] の最終インデックスを 0 に設定する必要があります。

于 2013-10-04T10:40:13.480 に答える