[英]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.