如何在C中反转字符串(不在位)?

时间:2012-11-07 08:28:57

标签: c string

我已经搜索过了,但我能找到的就是一个函数来反转字符串。这是我到目前为止所做的:

char* reverseString(char* string)
{
    int i, j;
    char reversed[sizeof(string)];
    j = strlen(string);

    for (i = strlen(string); i >= 0; i--)
    {
        reversed[j - i] = string[i];
    }
    return reversed;
}

但是,这会遇到反转为局部变量的问题,因此返回指向它的指针会抛出

warning: function returns address of local variable [enabled by default]

4 个答案:

答案 0 :(得分:2)

首先,表达式sizeof(string)返回指针的大小,而不是字符串的长度。也可以使用strlen(string)。并且如ta.speot.is所述,您需要为终止'\0'添加一个字符,并将该终结符添加到反向字符串。

至于你的问题,变量reversed存储在堆栈中,当函数返回时,你的内存区域不再可用。你要么必须在堆上分配那个内存,例如malloc(并稍后使用free释放该内存)或创建变量static,但在这种情况下,您无法在多线程程序中使用它。

答案 1 :(得分:2)

您可以为它动态分配内存:

char* reverseString(char* string)
{
    int i;
    int j = strlen(string);
    char *reversed = malloc(j + 1);
    ...

在这种情况下,调用者必须记住free()返回的已分配缓冲区。

或者你可以让调用者传入一个足够大的缓冲区来保存反向字符串:

char* reverseString(char* string, char *reversed)
{
     int i, j;
     j = strlen(string);

     for (i = strlen(string); i >= 0; i--)
     {
 ...

另请注意,在您当前的代码中:char reversed[sizeof(string)];错误, 在此函数string中只有一个char*,因此sizeof(string)为您提供char*的大小,而不是此char *指向的字符串的长度。

答案 2 :(得分:1)

您可以使用malloc为反向字符串分配空间,也可以让调用者为新字符串提供空间。 后者通常可以降低编程错误导致内存泄漏的风险。

void reverseString(char *reversed, char *string)
{
    int i, j;
    j = strlen(string);

    for (i = strlen(string) - 1; i >= 0; i--)
    {
        reversed[i] = string[j-i];
    }
    reversed[j] = 0;  /* Don't forget to nul-terminate the reversed string */
}

答案 3 :(得分:0)

如果您不想在函数中分配然后返回,请提供目标缓冲区。然后由呼叫者负责,其反向大到足以适合来源。

char* reverseString(char* source, char* reversed) {...}

并且yes sizeof不是检查字符串大小的正确方法,请使用strlen()