-3

この問題に対する答えをしばらく探していましたが、解決策が見つからないようです。引数の長さが異なる場合、エラーは発生しません。それらが同じ長さの場合、segfault エラーが発生します。この関数は、2 つの文字列を比較し、i 番目の各文字の最大値を含む新しい文字列を返すことを目的としています。私の機能は次のとおりです。

   char* charMax(char* string1, char* string2) 
   {
        int length1 = strlen(string1);
        printf("%d", length1);
        int length2 = strlen(string2);

        int lengthLarge = length1 >= length2 ? length1 : length2;
        int lengthSmall = length1 <= length2 ? length1 : length2;

        char* largerString = length1 >= length2 ? string1 : string2;
        char* result = malloc(lengthLarge + 1);


        for (int i = 0; i < lengthSmall; i++) 
            result[i] = string1[i] > string2[i] ? string1[i] : string2[i];

        if (length1 != length2) 
        {
            for (int i = lengthSmall; i < lengthLarge; i++) 
                result[i] = largerString[i];

            result[lengthLarge + 1] = '\0';

            return result;

            free(result);
        }
    }

助けてくれてありがとう!

4

2 に答える 2

3

それは、2 つの文字列の長さがまったく同じ場合、関数が何も返さないため、その結果がガベージであるという事実に関係している可能性があります。これはポインタとして解釈されます。そして...まあ...次に何が来るか知っていますよね?

そのコードを適切にインデントして、コメントを追加しましょう。

char* charMax(char* string1, char* string2) {
    int length1 = strlen(string1);
    printf("%d", length1);
    int length2 = strlen(string2);
    int lengthLarge = length1 >= length2 ? length1 : length2;
    int lengthSmall = length1 <= length2 ? length1 : length2;

    char* largerString = length1 >= length2 ? string1 : string2;
    char* result = malloc(lengthLarge + 1);

    for (int i = 0; i < lengthSmall; i++) {
        result[i] = string1[i] > string2[i] ? string1[i] : string2[i];
    }
    if (length1 != length2) {
        for (int i = lengthSmall; i < lengthLarge; i++) {
            result[i] = largerString[i];
        }

        result[lengthLarge + 1] = '\0';

        return result;

        free(result); /* uhm, what? this will never execute */
    }

    /* oops - what happens now? who knows? */
}
于 2013-03-12T01:35:04.613 に答える
1

いくつかの問題がありますが、Nik's answer は主要なものを指摘しています。別のものはここにあります:

result[lengthLarge + 1] = '\0'; // out of bounds! 
// this should be result[lengthLarge] = '\0'

また、この署名は目的に適しています。

char* charMax(const char *string1, const char *string2);
于 2013-03-12T01:43:05.360 に答える