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' 还需要一个字符,并在最后复制它:

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

strlenis返回的类型size_t是无符号类型。使用%d格式打印它是一种未定义的行为。您可以%zu在 C99 中使用,也可以在 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 Common definitions<stddef.h>
size_t,它是 sizeof 运算符 [...] 结果的无符号整数类型。

您的算法也是错误的,因为您同时使用end_of_stringtop_limit。您应该选择两种解决方案之一。

#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 回答