2013-01-16 83 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";