アプリ版:「スタンプのみでお礼する」機能のリリースについて

文字列を逆順して出力するプログラミングがわかりません。
#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逆順すると(謎の漢字)です。

となります。

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

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

gyakuの最後に'\0'を入れ忘れないようにしましょう。


余裕があれば、文字数が29文字を超える場合も考慮しましょう。(文字列の変数が'\0'を含めて30文字分で定義してあるので)
    • good
    • 0

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

なぜ reverse の中で putchar してるんだろ?


さておき, 重要な「文字」が gyaku には入っていませんね.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています