2013-01-16 85 views
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输出

我不知道这是否是执行任务的最佳方式,因为我是新来的指针和数组在C

但真正的问题是这样的:

任何人都可以找出原因在此行

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

如果去掉前面的 '4',所以它看起来像这样

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

该行将不会打印?

回答

7

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

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

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

1

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

0

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

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

需要将其改变为:

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

UPD-2:另一个错误修正将是:所有其它阵列后

1)添加array[5] = '\0';初始化线

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

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

UPD-3:但一般它会更正确初始化字符串中的适当方式:

char array[10] = "abcde";