こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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逆順すると(謎の漢字)です。

となります。

どこがおかしいんでしょうか?
よろしくおねがいします。

投稿日時 - 2008-07-24 21:46:41

QNo.4201611

困ってます

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

> 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 );
}
注:インデントに全角空白を用いています。タブに一括変換して下さい。

投稿日時 - 2008-07-25 11:25:02

このQ&Aは役に立ちましたか?

19人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

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

投稿日時 - 2008-07-25 21:59:30

ANo.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の文字列の場合はどういう風にすればよいでしょうか。考えてみてください。

投稿日時 - 2008-07-24 22:09:02

ANo.1

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

投稿日時 - 2008-07-24 21:49:51

あなたにオススメの質問