C中的反向字符串 - 我做错了什么?

时间:2013-01-23 16:57:35

标签: c string pointers

我已完成以下函数来反转字符串:

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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

strlen返回的类型为size_t,这是一种无符号类型。使用%d格式打印它是一种未定义的行为。您可以在C99中使用%zu,也可以在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_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;
}

答案 2 :(得分:1)

strlen返回size_t,因此您需要使用其他格式说明符

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

或(对于短sizeof(int)字节的字符串)投射长度

printf("%d", (int)strlen(reversed_string));

答案 3 :(得分:0)

使用%u作为格式说明符,而不是%d

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