2013-03-10 57 views
2

我目前正在學習C,但無法通過此練習。我必須創建一個遞歸函數來將string1轉換爲string2。這是我的代碼。我很樂意感謝你的幫助。使用遞歸函數反轉字符串

#include <stdio.h> 
#define MAX 100 

void reverse(char s1[],char s2[],int n,int j); 

int main() 
{ 
    char string1[MAX]="How Are You Mate"; 
    char string2[MAX]=""; 
    int n=0; 
    int i=0; 
    int j=0; 

    for(i=0;string1[i]!='\0';i++) 
     n++; 
    reverse(string1,string2,n,j); 
    printf("String-a normal:\n%s\n",string1); 
    printf("String-a reverse:\n%s\n",string2); 
    return 0; 
} 

void reverse(char s1[],char s2[],int n,int j) 
{ 
    if(n>0) 
    { 
      s2[j]=s1[n]; 
      reverse(s1,s2,n-1,j+1); 
    } 
    else 
      s2[j]='\0'; 
} 
+0

是什麼'S2 []'對於? – 2013-03-10 11:27:41

+0

代碼確實編譯正常,問題是它不顯示任何字符,當我打印2字符串。 – Lind 2013-03-10 11:29:56

+0

s2 []代表第二個字符串 – Lind 2013-03-10 11:34:40

回答

3

反轉開始通過複製string1陣列的第n字符到string2。第n號字符恰好是空終止符。它成爲新字符串的第一個字符,因此字符串對於所有標準C例程都是空的,包括printf

調用

reverse(string1,string2,n-1,j); 
main

應該解決這個問題。 reverse中的條件也應該從if(n>0)更改爲if(n>=0)

+0

感謝這是我正在尋找的答案。我在for循環中創建了條件string1 [i]!='\ 0',但我從第一個字符開始計數,我認爲這就是問題在這裏。 – Lind 2013-03-10 11:42:31

+0

我沒有把n-1放在函數上,但是我聲明瞭int n = -1。至於n> = 0,這是必要的,謝謝。 – Lind 2013-03-10 11:45:02

+0

@Lind從'-1'開始'n'也可以。順便說一下,你可以從'main'中刪除'j'的聲明,因爲它被賦值爲零,並且之後沒有被更改,所以你可以通過'0'作爲'reverse'的最後一個參數來獲得相同的效果。 – dasblinkenlight 2013-03-10 11:47:00

5

就地(呼叫者可以使字符串拷貝調用此函數之前)串尾遞歸

void reverse (char *str, size_t len) 
{ 
    char tmp; 
    if (len-- < 2) return; 

    tmp = *str; 
    *str = str[len]; 
    str[len] = tmp; 

    reverse (str+1, len -1); 
} 

Ø逆轉,如果你不想指針:

void reverse (char str[], size_t len) 
{ 
    char tmp; 
    if (len-- < 2) return; 

    tmp = str[0]; 
    str[0] = str[len]; 
    str[len] = tmp; 

    reverse (str+1, len -1); 
} 
+0

This works to.Thanks – Lind 2013-03-10 11:47:06

+0

但是,你能解釋給你的老師嗎? – wildplasser 2013-03-10 11:48:55

+0

我修復了我原來的解決方案,是的,我明白了,雖然我必須再讀一遍指針,因爲我對他們沒有清晰的想法。 – Lind 2013-03-10 11:53:31

2

雖然它不是保存任何地方產生的字符串,你會明白。

#include <stdio.h> 

void rev (const char* str); 

int main() { 
    const char str[] = "!dlrow ,olleH"; 

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

    rev(str); 
    printf("\n"); 

    return 0; 
} 

void rev (const char* str) { 
    char c = *str; 
    if (c != '\0') { 
      rev(str + 1); 
     printf("%c", c); 
    } 
} 
+0

謝謝,但我還沒有讀過指針。 :P – Lind 2013-03-10 11:46:24

1

我已更正程序。請找到的

for(i=0;string1[i]!='\0';i++) 
n++; 

代替下面

void reverse(char s1[],char s2[],int n,int j) 
{ 
if(n>0) 
{ 
     s2[j]=s1[n-1]; 
     reverse(s1,s2,--n,++j); 
} 
else 
     s2[j]='\0'; 
} 
0

的變化,我建議利用圖書館,大小= strlen的(陣列)在ARRA計算有多少個字符