C中的奇怪printf输出

时间:2013-01-16 14:51:35

标签: c printf output

#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);

该行根本不会打印?

3 个答案:

答案 0 :(得分:7)

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

此代码string = reversed;将仅复制指针,并再次指针的本地副本,因此它在函数外无效。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

UPD:主要问题在于代码行char reversed[size];。 它是一个常规局部变量,它具有自动持续时间,这意味着它在调用函数时会弹出,并在函数返回(see this link)时消失。

您需要将其更改为:

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