- ベストアンサー
c言語の文字列の逆順のプログラムがわかりません
文字列を逆順して出力するプログラミングがわかりません。 #include <stdio.h> #include <string.h> void reverse(char *moji, char *gyaku); int main(void) { char x[30]; char y[30]; puts("文字を入力してください。\n"); scanf("%s", x); reverse(x, y); printf("逆順すると%sです。\n", y); return (0); } void reverse(char *moji, char *gyaku) { int i, len; len = strlen(moji); gyaku = moji + len - 1; for(i = 0; i < len; i ++){ putchar((int)*gyaku); gyaku--; } } 理想とする実行結果は 文字を入力してください。 abcdefg 逆順するとgfedcbaです。 なんですが、 上記のソースを実行すると 文字を入力してください。 abcdefg gfedcba逆順すると(謎の漢字)です。 となります。 どこがおかしいんでしょうか? よろしくおねがいします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> gyaku = moji + len - 1; 最終的な gyaku の終端を決めるのに moji は直接関係しません。moji の長さだけです。 #include <stdio.h> #include <string.h> void reverse( char *moji, char *gyaku ) { int len; len = strlen( moji ); gyaku += ( len - 1 ); // moji とは直接関係なし while( *moji ){ *gyaku = *moji; putchar( *gyaku ); gyaku--; moji++; } } void main() { char x[30] = "123456789"; char y[30] = { 0x00 }; // 初期化 reverse( x, y ); printf( " 逆順すると %s です。\n", y ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。
その他の回答 (3)
- JaritenCat
- ベストアンサー率37% (122/322)
gyakuの最後に'\0'を入れ忘れないようにしましょう。 余裕があれば、文字数が29文字を超える場合も考慮しましょう。(文字列の変数が'\0'を含めて30文字分で定義してあるので)
- asuncion
- ベストアンサー率33% (2127/6289)
例えば、"abcd"(長さ4)を逆順にした"dcba"を求める場合を考えてみます。 reverse関数の中でどういう処理をすればいいかというと、 ・gyaku[0]にmoji[3]('d')を入れる。 ・gyaku[1]にmoji[2]('c')を入れる。 ・gyaku[2]にmoji[1]('b')を入れる。 ・gyaku[3]にmoji[0]('a')を入れる。 ・gyaku[4]に'\0'を入れる。 ですね。 さて、長さ4の文字列の場合は上記のとおりでしたが、 一般に長さnの文字列の場合はどういう風にすればよいでしょうか。考えてみてください。
- Tacosan
- ベストアンサー率23% (3656/15482)
なぜ reverse の中で putchar してるんだろ? さておき, 重要な「文字」が gyaku には入っていませんね.