• ベストアンサー

プログラム

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

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

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

>文字列を逆順にする関数を作ってるのですがうまくできません。 >このプログラムの間違ってる所をおしえてください。  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 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

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

  • php504
  • ベストアンサー率42% (926/2160)
回答No.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; を追加しましょう

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

minaraiH
質問者

補足

>>s+=strlen(s); って何してるんだろう これは最後尾まで進めてます。最後尾までいったら逆に1文字ずついれていってるわけです。

関連するQ&A

  • abcdとキーボードで打ったらdcbaと表示されるプログラム

    C言語に関しては初心者です。 メイン関数は変更せずに行います。 /* reverse.c: reverse a given string */ #include <stdio.h> #include <string.h> void reverse(char *); /* プロトタイプ宣言 */ int main(void) { char str[100]; scanf("%s", str); reverse(str); printf("%s\n", str); return (0); } void reverse(char *s) { char n; int i; char str; n = strlen(str) - 1; for(i=0,i++,i<=100) { s[i] = *s[n-i]; printf("%s\"s[i]); } }

  • 文字の並べ替え

    C言語で文字の並べ替えをしたいのですが条件があり ポインタを使って文字を並べ替える別の関数をを渡さなければなりません.(void reverse(char *str)をつくる) そこで作ったのが #include <stdio.h> #include <string.h> void reverse(char *str); int main(void){ char s[80]; gets(s); reverse(s); printf("%s\n",s); return 0; } void reverse(char *str){ char q[80]; int i,n; n=strlen(str)-1; str+=n; for(i=0;i<=n;i++)q[i]=*str--; str++; q[i]='\0'; for(i=0;i<=n;i++)*str++=q[i]; } なのですが ポインタを使っている意味が余りないので ポインタを使うよりよいプログラムを教えてください. (アドバイスでもかまいません.)

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

  • プログラミング 関数

    逆順する関数reverseを作成したいんです。 以下のは関数reverseを利用したmainのプログラムです。 #include <stdio.h> void reverse(char str1[],char str2[]); int main (void) { char strin[255]="abcdefg"; char strout[255]; reverse(strin, strout); printf(" input=%s\n",strin); printf("output=%s\n",strout); return 0; } 教えてください。

  • C言語の、ポインターの問題を教えて下さい

    C言語の、ポインターを使って大文字と小文字を入れ替えるプログラムを教えて下さい。 作ったのですが、うまくいかず困っています。 分かる方、訂正してください。 よろしくお願いいたします。 #include<stdio.h> void reverse(char *str) { int i; for(i=0;str[i]!='\0';i++) { if(str[i]>=0x61) {str[i]-0x20;} if(0x40<str[i]<0x5B) {str[i]+0x20;} } return(str); } int main(void) { int num; char *str="AddsssEEEEwwwJojoHoih"; printf("Before reverse %s \n",str) str=reverse(str); printf("After reverse %s \n",str); return 0; }

  • C言語 文字列の操作

    文字Cが含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • プログラミング C++

    プログラミングのC言語で入力文字を関数を使ってポインタを使わずに逆順にするプログラムを作りたいのですが、ポインタを使ってならできるのですが、ポインタを使わずにはどのように考えればいいでしょうか?。 #include <string.h> void reverse (char *ss); int main(void) { char ss[14]; gets(ss); reverse(ss); printf("逆順=%s\n",ss); return 0; } void reverse(char *ss) { int a,b,c; b=0; c=strlen(ss)-1; while(b<c){ a=*(ss+b); *(ss+b)=*(ss+c); *(ss+c)=a; b++; c--; } }

  • 実行できません

    #include<iostream> #include<cstring> using namespace std; void reverse(char *str,int count=0); int main(){ char *s1="this is a test."; reverse(s1); cout<<s1; return 0; } void reverse(char *str,int count){ int i,j; char temp; if(!count)count=strlen(str)-1; for(i=0,j=count;i<j;i++,j--){ temp=str[i]; str[i]=str[j]; str[j]=temp; } } これはあるサンプルプログラムなのですが、visual studio 2008でコンパイルしたらこのように実行ファイルはできるのですが実行できません。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C 4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりま せん。/EHsc を指定してください。 Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:samplem.exe samplem.obj どうしてでしょうか?よろしくお願いします。

  • このプログラムのどこを直せばいいんでしょうか?

    いま、文字列strの中に文字cが含まれている個数を表示するプログラムを作っているんですが、下のように作っても、上手く行きません。 どこをどう直せばいいのか教えてください! #include <stdio.h> int str_chnum (const char str[],int d) { int i=0; int sum=0; while(str[i]!=0){ if(str[i]==d ){ sum++; } i++; } return(sum); } int main(void) { int c; char str[128]; puts("put sentence..."); scanf("%s",str); puts("search character..."); scanf("%d",&c); printf("there are %d %ds in this sentence.",str_chnum(str,c),c); return(0); }

  • ポインタ勉強中です。しかも実行するとおかしいです。

    <本に載ってたソース> #include<stdio.h> #include<string.h> int main() { char msg[20]; char *str=NULL; int i; int cnt; str=&msg[0]; printf("文字を入力してください"); scanf("%s",&str); cnt=strlen(msg); str=msg+cnt; for(i=cnt;i>=0;i--){ printf("%c",*(str--)); } printf("\n"); return 0; } char *str=NULL;は、ポインタstrを空にするということでしょうか? いつもながらstrlenとsizeofが混じります。 sizeofがバイトの大きさで、strlenが、文字数でしたっけ?

専門家に質問してみよう