C言語で文字の並べ替えをする方法

このQ&Aのポイント
  • C言語で文字の並べ替えをする方法について教えてください。
  • ポインタを使った文字の並べ替えを行うプログラムを示していただけますか?
  • ポインタを使った文字の並べ替えについて、効果的なプログラムの作り方を教えてください。
回答を見る
  • ベストアンサー

文字の並べ替え

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]; } なのですが ポインタを使っている意味が余りないので ポインタを使うよりよいプログラムを教えてください. (アドバイスでもかまいません.)

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

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

とりあえず書いてみました。 void reverse(char *s){ char tmp, *s2; int i,n; n=strlen(s); s2=s+n-1; for(i=0;i<n/2;i++){ tmp=*s; *s++=*s2; *s2--=tmp; } } 引数の文字数が何文字あっても問題のおきないところと、文字の代入回数が4分の3にですむところが良い点です。アルゴリズムのシンプルさ、という観点では元のルーチンのほうが上な気がします。

ebinamori
質問者

お礼

回答有難うございます. 私はこういうプログラムを作りたかったんです. 大変参考になりました.

関連する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言語の、ポインターの問題を教えて下さい

    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言語の勉強をしてて、文字列を反転させる以下のようなプログラムを書いてみました。 #include <stdio.h> #include <string.h> void str_reverse(char s[]) { int i,l=strlen(s); char *r; for(i=0;i<l;i++){ r[i]=s[l-i-1]; } for(i=0;i<l;i++) s[i]=r[i]; return; } int main() { char s[100]; scanf("%s",&s); str_reverse(s); printf("%s",s); return 0; } 実行してみると基本的にうまくいくのですが、文字を10文字入力した時だけ 「問題が発生したため、○○.exeを終了します。…」 というエラーウィンドウが出てきてしまいます。 どなか原因と解決法を教えてください。

  • どこがちがうのでしょうか?

    以下の二つのプログラムはユーザーが文字を入力し、80文字以下なら ピリオドを追加して表示するというものです。上はうまくいきますが、下はうまくいきません。なぜでしょうか? #include<string.h> #include<stdlib.h> int main() { char str[80]; int i; printf("文字列を入力してください。\n"); gets(str); if(strlen(str)<80) { for(i=strlen(str);i<79;i++) strcat(str,"."); } printf("%s",str); } #include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char str[80]; int i; printf("文字列を入力してください。\n"); gets(str); if(strlen(str)<80) { for(i=strlen(str)+1;i<79;i++) str[i] = "."; } printf("%s",str); }

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

    <本に載ってたソース> #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が、文字数でしたっけ?

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

  • プログラム

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

  • 小文字のみを数える方法

    小文字のみを表示させるプログラミングがいくらやってもできません。範囲指定をどこですれば良いのかわからず、全部の文字数をカウントしてしまいます。 ご指摘お願いします。 #include <stdio.h> #include <string.h> int main(void) { char str[256]; int a; printf("大文字と小文字をランダムに入力\n"); gets(str); printf("小文字の数は%dです\n",strlen(str),a); return(0); }

  • 文字列を関数に渡すぷろぐらむなのですがおかしいです。

    <ソース> #include<stdio.h> #include<stdlib.h> void str(char a[]); int main() { char st[10]="abcde"; str(st); str("ABCabc123"); return 0; } void str(char a[]) { int i; printf("%s\n",a); i=0; while(a[i]){ a[i]=toupper(a[i]); putchar(a[i]); i++; } putchar('\n'); } 分からないところがあるので質問します。 toupperは、大文字にするんですよね。 putcharは、基本的にchar型でしたっけ? putsとgetsは、int型でしたっけ? 後、プログラムが暴走してます。 どこがおかしいんでしょう?

  • 文字の並べ替えについて質問

    以下のような標準入力したアルファベットの文字列(jgoaihoghohgo...みたいな)を昇順に並べ替えるプログラムを作成して思ったのですが、各文字の比較ってやっぱりアスキーコードの数字を比較しているのでしょうか? だとするとif(s[i]<s[j])の部分で少し疑問を感じました。 if(s[i]>s[j])ではないのでしょうか?こうでないとs[i]にaがs[j]にbが格納されているときに並べ替えが起きてしまうような気がするのです。 基本的なことのようですがお願いしますm(__)m あとプログラムに関して不備を感じましたら訂正のアドバイスをお願いします。 #include<stdio.h> #include<string.h> int main(void){ char s[BUFSIZ]; char s2[BUFSIZ]; int i,j,m; printf("input sentense.\n"); scanf("%s",s); m=strlen(s); for(i=0;i<m;i++){ for(j=0;j<m;j++){ if(s[i]<s[j]){ s2[10]=s[i]; s[i]=s[j]; s[j]=s2[10]; } } } printf("%s",s); return(0); }

専門家に質問してみよう