2016-11-16 99 views
4

遞歸。我查了其他在線解決方案,他們似乎與我的非常相似。 代碼應該顛倒字符串(在其位置),但它不。例如,當輸入爲st2 =「abcdefg」時,輸出爲空字符串。我期待st2 =「gfedcba」。我錯過了什麼?遞歸:在其位置的反向字符串

#include <stdio.h> 
#include <string.h> 


void recurse_reverse(char s[], int sz) 
{ 
    int i=0,j = sz -1; 
    if(i<j) 
    { 
     swap(&s[i],&s[j]); 
     recurse_reverse(s+1, sz-2); 

    } 
} 


void swap(char* s1, char *s2) 
{ 
    char tmp; 
    tmp = *s1; 
    *s1 = *s2; 
    *s2 = tmp; 
} 


int main(void) 
{ 
    char st1[9] = "abcdefg", st2[9]; 
    strcpy(st2,st1); 
    recurse_reverse(st2,9); 
    printf("s1 = %s\ns2 = %s",st1,st2); 
    printf("\n"); 
    return 0; 
} 
+2

你應該通過'strlen的(ST2)''來recurse_reverse'。 – Groo

+1

你交換的第一個字符之一是成爲字符串末尾的'\ 0'。 – pmg

+0

st1的唯一目的是顯示舊的值。請刪除st1並查看代碼,我沒有想到它會混淆你。 recurse_reverse的函數原型應該是:void recurse_reverse(char s [],int size);假設st1 [9]不存在,strcpy()不存在,st2 [9] =「abcdefg」,這是我想要顛倒的。謝謝。 – Mynicks

回答

5

您正在交換st1末尾的2個零字節。因此,st2以空字節開始,因此printf()不會打印任何內容。 你只需要解決你的參數傳遞。取而代之的

recurse_reverse(st2,9); 

recurse_reverse(st2,strlen(st1)); 

你可能要添加邏輯,以確保您的目的地陣列st2有足夠的空間。

+0

@ Jean-FrançoisFabreC標準使用術語「空字符」來表示「\ 0''。所以,我沒有看到任何將它稱爲「空字節」或任何歧義的問題。 – usr

+0

請在我的代碼下面查看我的評論。我應該把它放在這裏,但我犯了一個錯誤。另外,在看到你的回答後,通過演繹推理我輸入recurse_reverse(st2,strlen(st2));並像魅力一樣工作。 – Mynicks

+0

@usr正式指出,我從來不知道如何稱呼它。至少不是'NULL'。至少這個答案是好的,但我對另外兩個人生氣。我只是想知道它會如何結果。 –

1
#include <stdio.h> 
#include <string.h> 

void swap(char* s1, char *s2); 

void recurse_reverse(char s[], int sz) 
{ 
    int i=0,j = sz-1; 
    if(i<j) 
    { 
     swap(&s[i],&s[j]); 
     recurse_reverse(s+1, sz-2); 

    } 
} 


void swap(char* s1, char *s2) 
{ 
    char tmp; 
    tmp = *s1; 
    *s1 = *s2; 
    *s2 = tmp; 
} 


int main(void) 
{ 
    char st1[9] = "abcdefg", st2[9]; 
    int len=0; 
    strcpy(st2,st1); 
    len =strlen(st2); 
    recurse_reverse(st2,len); 
    printf("s1 = %s\ns2 = %s",st1,st2); 
    printf("\n"); 
    return 0; 
} 
+2

雖然此代碼片段可能會解決問題,包括解釋[真的有幫助](// meta.stackexchange.com/q/114762)以提高您的帖子的質量。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –

3

我添加了一個printf語句來調試問題並得到了下面的輸出。您正試圖訪問第9個變量,該變量是一個已終止的空字符\0因此,您只能獲得\0作爲輸出,而不是實際的反轉字符串。

不用硬編碼字符串的大小,你可以使用strlen來獲取字符串長度。

1st char = a and 9th char is ▒ 
1st char = b and 9th char is 
1st char = c and 9th char is g 
1st char = d and 9th char is f 
s1 = abcdefg 
s2 = ▒ 

解決方案

擬更改代碼

recurse_reverse(st2,strlen(st1)); 

輸出

1st char = a and 9th char 9th char is g 
1st char = b and 9th char 9th char is f 
1st char = c and 9th char 9th char is e 
s1 = abcdefg 
s2 = gfedcba