0

我已经搜索过了,但我能找到的只是一个将字符串反转到位的函数。这是我到目前为止所拥有的:

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;
}

但是,这解决了 reversed 作为局部变量的问题,因此返回指向它的指针会抛出

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

4 回答 4

2

首先,表达式sizeof(string)返回指针的大小,而不是字符串的长度。也用于strlen(string)那个。正如 ta.speot.is 所指出的,您需要为 terminating 添加一个字符,'\0'并将该终止符添加到反转的字符串中。

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

于 2012-11-07T08:30:25.443 回答
2

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

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

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

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

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

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

另请注意,在您当前的代码中:char reversed[sizeof(string)];是错误的,这个函数内部string只是 a char*,所以sizeof(string)给你 a 的大小char*,而不是这个 char* 指向的字符串的长度。

于 2012-11-07T08:33:39.240 回答
1

You can either allocate space for the reversed string with malloc or let the caller provide space for the new string. The latter usually reduces the risk of programming errors causing memory leaks.

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 */
}
于 2012-11-07T08:33:59.360 回答
0

Just provide the target buffer if you do not want to allocate in your function and then return that. The responsibility then is by the caller that reversed is big enough to fit source.

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

and yes sizeof is not the correct way to check a string size, use strlen()

于 2012-11-07T08:34:30.357 回答