1

文字列を逆にするために次の関数を実行しました。

char* reverseString(char *original_string)
{
    int length = strlen(original_string);
    char *end_of_string = original_string + (length - 1);
    char *reversed_string = malloc(sizeof(char) * length);

    int count = 0;
    int top_limit = length;

    while (count < length) {
        reversed_string[count] = end_of_string[top_limit];
        top_limit--;
        count++;
    }

    return reversed_string;
}

私が計画していた戦略は、元の文字列の末尾にポインターを置き、新しい文字列に逆方向にコピーすることです。ここで何が間違っているのかわかりませんが、実行するとき:

char* prova = "hello";
char* reversed_string;
reversed_string = reverseString(prova);
printf("%d", strlen(reversed_string));

正しい長さが表示されず、コンパイル時に次の警告が表示されます。

test.c:46: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘size_t’
4

4 に答える 4

4

'\0' にはもう 1 文字必要で、最後にコピーします。

char* reverseString(char *original_string)
{
    int length = strlen(original_string);
    int top_limit = length-1;
    //char *end_of_string = original_string + top_limit;
    char *reversed_string = malloc(sizeof(char) * (1+length));

    int count = 0;

    while (count < length) {
        reversed_string[count] = original_string[top_limit];
      //reversed_string[count] = *(end_of_string--) ;
        top_limit--;
        count++;
    }
    reversed_string[count] = '\0';
    return reversed_string;
}
于 2013-01-23T17:03:36.953 に答える
2

によって返される型strlensize_t、符号なしの型です。format を使用%dして印刷すると、未定義の動作になります。%zuC99 で使用するか、C89 で使用%uしてキャストすることができますunsigned int

#include <string.h>

/* C89 */ printf("%u\n", (unsigned int)strlen(reversed_string));
/* C99 */ printf("%zu\n", strlen(reversed_string));

C11 (n1570)、§ 7.19 共通定義<stddef.h>
size_t。これは、sizeof 演算子 [...] の結果の符号なし整数型です。

end_of_stringと の両方を使用しているため、アルゴリズムも間違っていますtop_limit。2 つのソリューションのいずれかを選択する必要があります。

#include <string.h>

char *reverseString(char *original_string)
{
    size_t length = strlen(original_string);
    char *reversed_string = malloc(length + 1);
    size_t start;
    size_t end;

    for (start = 0, end = length - 1; start < length; start++, end--)
    {
      reversed_string[start] = original_string[end];
    }

    reversed_string[start] = '\0';

    return reversed_string;
}
于 2013-01-23T17:00:20.423 に答える
1

strlenを返すsize_tため、別の書式指定子を使用する必要があります

printf("%zu", strlen(reversed_string));

または(そのsizeof(int)バイトより短い文字列の場合)長さをキャストします

printf("%d", (int)strlen(reversed_string));
于 2013-01-23T16:59:50.817 に答える
0

%u代わりにフォーマット指定子として使用%d

printf("%u", strlen(reversed_string));
于 2013-01-23T17:02:08.060 に答える