みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

プログラム

文字列を逆順にする関数を作ってるのですがうまくできません。
void reverse(char *str, int count=0)
{
int i;
char *s="momonga";
s+=strlen(s);
count=strlen(s);

for(i=count; i<0; i--, str++, s--){
*str++=*s++;
}
}

int main()
{
char s1[20];
int c;
reverse(s1,c);
printf("%momongaを逆順にすると%sで文字数が%dです",s1,c);
return 0;
}

このプログラムの間違ってる所をおしえてください。

投稿日時 - 2009-01-19 14:24:45

QNo.4642906

すぐに回答ほしいです

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

>文字列を逆順にする関数を作ってるのですがうまくできません。
>このプログラムの間違ってる所をおしえてください。

 momonga が「逆順にする関数」と main 関数に2つ現れますが、これですと、逆順にする関数を作る必要性がないような・・。

☆「逆順にする関数」は、(文字列を受け取って)逆順にする「機能」だけを提供すればよいかと。

 例えば文字列を、musasabi と変更したい場合、main 関数の1ケ所だけを直すだけの方が、2ケ所を直すより楽で間違いもないかと。

また、細かいことですが、

 ・for 文で入れ換えるのなら、「ポインタ」でなく「配列」の方が分かり易い?のでは・・。
 ・「ポインタ」で入れ換えるのなら、while の方が楽だと思います。

☆以下、「ポインタ」で入れ換える例です(BorlandC++5.5.1)。

 ・両端(先頭、末端)から中央へ、「ペア」で順に入れ換えています。

#include <stdio.h>
#include <string.h>

int reverse( char *str )
{
 int iLen, i;
 char c0, c9; // 一時待避用変数

 i = iLen = strlen( str );

 i--;

 while( i > 0 ){ // 中央まで

  c0 = *str; // 先頭から中央へ(A)
  c9 = *( str + i ); // 末端から中央へ(B)

  *str = c9;
  *( str + i ) = c0;

  str++; // A:先頭をひとつずらす→

  i -= 2; // B:先頭がひとつずれたのを含む→←←
 }
 return( iLen );
}
int main( void )
{
 char s1[ 32 ] = "123456789abcdef"; // "momonga";
 int c;

 printf( "%s を逆順にすると ", s1 );

 c = reverse( s1 );

 printf( "%s で、文字数が %d です", s1, c );

 return( 0 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

投稿日時 - 2009-01-22 12:06:41

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

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

回答(4)

ANo.3

>char *s="momonga";

これ専用のreverse関数になっているところが変です。
どうせ作るのであれば、他の文字列でも使えるように
する方がよいと思いませんか?

投稿日時 - 2009-01-19 21:01:12

ANo.2

s+=strlen(s);
これで最後尾まで進めたのなら
count=strlen(s);
ここでsの長さは0になってますよ
順番を入れ替えたらいいですが
count=strlen(s);
s+=strlen(s);
同じ関数を2回も呼び出すのは無駄なので
count=strlen(s);
s+=count;
の方がよさそう
そしてsは文字列の最後じゃなくてその後にきてるのでやりたいことは
s+=count - 1;
でしょう

for(i=count; i<0; i--, str++, s--){
*str++=*s++;
}
iが0以上の間ループするので i<0 じゃなくて i > 0 ですね
それとstr++が2回あるしs++とs--でsが変化しませんよ
for(i=count; i>0; i--, str++, s--){
*str=*s;
}

for(i=count; i>0; i--){
*str++=*s--;
}
そしてstrの最後に文字列の最後の値として
*str = 0;
を追加しましょう

投稿日時 - 2009-01-19 15:05:23

ANo.1

わりといろんな所が間違ってる気がする.
ぱっと見ておかしいのは
・main で reverse(s1, c) と呼び出しているがこの c に期待した答えは入らない.
・s+=strlen(s); って何してるんだろう.
・reverse の for 文がむちゃくちゃ. 紙と鉛筆を使って自分で動かしてみれば「いかにむちゃくちゃか」が理解できると思う.
ちなみに C++ なんだから i は for 文で定義するのがよいと思う.

投稿日時 - 2009-01-19 14:39:08

補足

>>s+=strlen(s); って何してるんだろう

これは最後尾まで進めてます。最後尾までいったら逆に1文字ずついれていってるわけです。

投稿日時 - 2009-01-19 14:45:41

あなたにオススメの質問