0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * reverse(char *string);
int main(int argc, char *argv[])
{
    char array[10];
    array[0] = 'a';
    array[1] = 'b';
    array[2] = 'c';
    array[3] = 'd';
    array[4] = 'e';
    printf("1%s\n",array);
    char *p = reverse(array);
    printf("4%s\n",p);
    printf("5%s\n",array);
}

char * reverse(char *string)
{
    int size = strlen(string);
    char reversed[size];
    int i;
    int j = 0;
    for(i = size-1; i >= 0; i--)
    {
        reversed[j] = string[i];
        j++;
    }
    printf("2%s\n",reversed);
    string = reversed;
    printf("3%s\n",string);
    return reversed;
}

这段代码基本上只是初始化一个值数组并将其传递给一个反转这些值的方法。

我不确定这是否是执行任务的最佳方式,因为我不熟悉 C 中的指针和数组。

但真正的问题是:

谁能弄清楚这一行的原因

printf("4%s\n",p);

如果您删除前面的“4”,那么它看起来像这样

printf("%s\n",p);

该行根本不会打印?

4

3 回答 3

7

您在函数中返回一个指向局部变量(reversed)的指针,reverse问题实际上应该是:Why did it work in the first place?

此代码string = reversed;将仅复制指针,并再次复制指针的本地副本,因此它在函数之外没有任何影响。

要反转字符串,您不需要额外的内存 - 这可以就地完成。

于 2013-01-16T14:53:06.383 回答
1

C 中的字符串必须以空字符结尾。您在非空终止字符串上使用 strlen 。

于 2013-01-16T14:54:37.473 回答
0

此外,您只是一个非常幸运的人,因为您的代码存在严重问题:您忘记\0在字符串末尾添加符号。

UPD:主要问题是代码行char reversed[size];。它是一个常规的局部变量,它具有自动持续时间,这意味着它在函数被调用时立即存在,在函数返回时消失(参见此链接)

您需要将其更改为:

char *reversed = malloc((size+1)*sizeof(char));

UPD-2:另一个错误修复将是:

1)array[5] = '\0';在所有其他数组初始化行之后添加

2)在reversed[j] = '\0';之后添加for...loop

for(i = size-1; i >= 0; i--)
{
    reversed[j] = string[i];
    j++;
}
reversed[j] = '\0';

UPD-3:但总的来说,它会以适当的方式更正确地初始化您的字符串:

char array[10] = "abcde";
于 2013-01-16T14:55:12.217 回答