繁体   English   中英

C语言中奇怪的printf输出

[英]Strange printf output in C

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

该行根本不会打印?

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

此代码string = reversed; 只会复制该指针,再复制该指针的本地副本,因此它不会在函数外部起作用。

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

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

此外,您只是一个非常幸运的人,因为您的代码存在严重问题:您忘记在字符串的末尾添加\\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";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM