• ベストアンサー

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逆順すると(謎の漢字)です。 となります。 どこがおかしいんでしょうか? よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

> 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)

回答No.4

gyakuの最後に'\0'を入れ忘れないようにしましょう。 余裕があれば、文字数が29文字を超える場合も考慮しましょう。(文字列の変数が'\0'を含めて30文字分で定義してあるので)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

例えば、"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)
回答No.1

なぜ reverse の中で putchar してるんだろ? さておき, 重要な「文字」が gyaku には入っていませんね.