2016-11-16 12 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

あなたはrecurse_reverse' 'に' strlenを(ST2)を '渡す必要があります。 – Groo

+1

あなたが入れ替える最初の文字の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ではない。少なくともその答えは良いですが、私は2つの他のものに怒っていました。私はちょうどそれがどのようになるか知りたかった。 –

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 
関連する問題