• ベストアンサー

自作関数を用いた文字の反転

タイトルのまんまですが入力された文字を反転して表示する方法がわかりません。 #include <stdio.h> char reversecopy(char moji[]) { int i; char reversemoji[51]; for(i = 50; i > 0; i--) { reversemoji[i] = moji[i]; } return reversemoji[50]; } void main(void) { char n[51]; printf("何か文字を入力してください: "); scanf("%s" ,n); reversecopy(n); n[50] = '\0'; printf("%s\n" ,n); return; } ここまでは作ったのですが、表示されるのは反転されていない文字です。どこかおかしい点があったら(絶対あるはずですが)ご指摘いただければ助かります。 よろしくお願いしますm(_ _)m

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

> reversecopy(n); ここで文字列を反転しているつもりなのだと思いますが、 関数reversecopy内では ローカル変数reversemojiに文字列をコピーしているだけで、 引数mojiの文字列は変更していません。 よって関数reversecopyを呼び出しても 引数で与えた文字列nは変化しません。 引数の文字列mojiに変更を加える処理をするか、 関数reversecopy呼び出し側でコピー先reversemojiを準備し reversemojiも引数とするなどする必要があります。 > for(i = 50; i > 0; i--) { >   reversemoji[i] = moji[i]; > } また、この記述で反転した文字列をreversemojiに 格納しているつもりなのかもしれませんが、 これは文字列を「後ろからコピー」しているだけで反転はしません。 (コピーと考えても、moji[0]がコピーされていないという問題があります。) 文字列を反転するには関数strlenなどを使用して文字列の長さを調べ、 文字列中の最後の文字が反転文字列中では最初の文字になるようにコピーします。 #1の > for(i = 50; i > 0; i--) { >   reversemoji[i] = moji[50-i]; > } では文字列の長さが51の時以外は正しく動作しないので 50の代わりに文字列の長さ-1を使います。 (iが0の時ループを抜けてしまうのでforループの継続条件も変更する必要がありますが)

cermet
質問者

お礼

ご回答ありがとうございましたm(_ _)m そういえばstrlenはなんか授業で言っていた気がします・・・ 忘れてました。これを使えば良かったんですね・・・ ご指摘ありがとうございます。

その他の回答 (6)

回答No.7

  "反転して表示する"だけなら、 void Reverse(char *str) { int i; for(i = strlen(str) - 1; i >= 0; i --) printf("%c", str[i]); return; } でもいいかな。  

cermet
質問者

お礼

ご回答ありがとうございますm(_ _)m こんなにさっぱりしているものなんですね・・・ 勉強になります!

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.6

include <stdio.h> #include <string.h> #define N_MAX_WORD 51 void reversecopy(char *buf) { int i, j, n; char c; n = strlen(buf); n--; for (i = 0, j = n; i < n / 2; i++, j--) { c = buf[i]; buf[i] = buf[j]; buf[j] = c; } } int main(void) { char buf[N_MAX_WORD]; int n; printf("何か文字列を入力してください: "); fgets(buf, N_MAX_WORD, stdin); n = strlen(buf); n--; buf[n] = 0; reversecopy(buf); printf("%s\n", buf); return 0; }

cermet
質問者

お礼

ご回答ありがとうございますm(_ _)m ご丁寧にプログラムを全部書いていただいてありがとうございます。 まだ知らない関数もあるけれど勉強になります。

  • ko_kinta
  • ベストアンサー率39% (43/109)
回答No.5

reversecopy()にscanfした文字列を渡していますが、反転文字を格納しているのはreversecopyのローカル変数reversemojiです。 printfに渡しているのはscanfした文字配列ですから反転されていないのは当たり前ですね。 修正方法としては、まずmain()で反転後の文字を格納する配列を用意してください。 標準入力から文字列を取得するのに、fscanf()はオーバーフローの危険があるのでお勧めしません。 fgets()の方が安全でしょう。 入力された文字列の長さをstrlen()で判断します。 reversecopyには反転前、後のふたつのポインタと文字列長を渡してください。 printfするのはもちろん反転後の配列。 reversecopy()では文字列の最終にはnull stopがあることを忘れないでくださいね。

cermet
質問者

お礼

ご回答ありがとうございますm(_ _)m fscanfとfgetsっていうのがあるんですか・・・ まだ知らないですが調べてみます。 ご丁寧にありがとうございました。

回答No.4

  >for(i = 50; i > 0; i--) { >reversemoji[i] = moji[i];  "文字列の終端"と"配列の終端"は、違います。  

cermet
質問者

お礼

ご回答ありがとうございますm(_ _)m うーん、まだ良くわかりませんが調べてみます。 これも勉強ですから。

  • dra2jp
  • ベストアンサー率25% (18/72)
回答No.3

配列要素を宣言しなくてもきちんと格納されることを利用した書き方や 関数の値受け渡しはきちんとできているのに コピーしかせずに終了しているソースを見たら 学校の課題だって事まるわかりですよ。 学校で、このプログラムの続きを書いて来いといわれてわからないから そっくりそのまま聞いたんでしょう。 ここでわからない部分を聞くのはいいですが、全部のソースを書いて答えだけ教えてくれというのはやめましょう。 そうじゃなくて、どうしてもわからない一部だけを聞くようにしてください。 プログラムを勉強しているという事は、仮にも好きでその専門のコースに進んでいるんでしょう。 自分の力になりませんよ。 と、もしかしたらいやみに取られるような言葉はこの辺にして。 このプログラムどおりじゃなくていいのでしたら 文字列処理の関数は沢山ありますからそれを利用すると便利です。 includeの意味はわかりますか? 文字列処理でしたらstring.hをインクルードすれば 様々な関数が使用できるようになります。 例えば2つの文字列をくっつけるような作業もたった1つの行ですみます。 いやみでいっているんじゃないです、私も過去にそういう傾向があって自分のためにならなかったので 同じ事をしてほしくないだけです。 頑張ってください。

cermet
質問者

お礼

ご回答ありがとうございますm(_ _)m 一応書き込んだものは自分で書いたものなのですが、配列要素を宣言しなくてもきちんと格納されることを利用した書き方というのは reversecopy(n); のことですか? このやり方は、前に質問をして答えていただいた方から学んだものです。 あと、自分も質問の仕方が曖昧で誤解を招いてしまったことを謝ります。「どこかおかしい点があったら(絶対あるはずですが)ご指摘いただければ助かります。」というのは、 「おかしいところがあったらヒントを出して下さると助かります」 と言うつもりで書いたのですが、少し曖昧でしたね。すいませんでした。 というかきっと悪いのは学校の課題の出し方です。 入力された文字列を反転させて表示する関数を作れ、とだけしか言われなかったので(いつもこんな感じですが)授業で習った関数だけしか使ってはいけないのかどうかもわかりません。 あぁ、なんだか愚痴みたいになってしまいましたが、ありがとうございましたm(_ _)m これからもがんばります。 長文ですいませんでした。

回答No.1

このPCにコンパイラが入っていないのと、ろくに見てないのではっきりとはいえませんが。 for(i = 50; i > 0; i--) { reversemoji[i] = moji[i]; } を for(i = 50; i > 0; i--) { reversemoji[i] = moji[50-i]; } のようにしたらいいんじゃないかと思います。

cermet
質問者

お礼

えーと、あとで自分もこう考えたのですが↑の方のご回答にはそれではできないということです。 なにはともあれご回答ありがとうございますm(_ _)m

関連するQ&A

  • 文字を反転させる。

    以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 力して下さい」などの画面表示)を行うこと. (1) キーボードから文字列を入力し,文字配列s[64] に格納する. (2) 文字配列s[64] に格納されている文字列を逆順にしてt[64] に格納する(配列全部を逆 順にするのではなく,NULL 文字までの要素を逆順にする). (3) t[64] を画面表示する. ポインタ使用不可、ヘッダファイル<stdio.h>だけ 入力された文字を反転させるということでしょうか?? #include <stdio.h> int main(void){ int i; char s[256]; char t[256]; printf("文字列を入力:"); scanf("%s" , s); for ( i = 0; i < '\n'; i++ ){ t[i] = s[i]; } printf("文字列の逆順は%s",t); getchar(); getchar(); return(0); } これだとただ入力された文字を出力するだけになってしまいますよね・・・・。どうすればいいのでしょうか?

  • 文字を逆転させて表示させるプログラミングなのですが・・・。

    #include<stdio.h> int main() { char moji[80]; char hantai[80]; int i; int j; int n; printf("半角文字列を入力:"); scanf("%s",moji); for(n=0;moji[n]!='\0';n++); for(i=n-1,j=0,i>=0;i++;j--){ hantai[j]=moji[i]; } hantai[j]='\0'; printf("反対から:%s\n",hantai); return 0; } 反対からが表示されません。 考えたのですがわかりません。

  • C言語 文字列の比較 compare

    プログラミング初心者です。 60文字以内の文字列を入力して、 大小関係を比較・表示するプログラムなのですが・・ 「AはBより大きい」という結果しか出ません。 どこが間違っているのか、ご指摘お願いしますっ。 #include<stdio.h> int main(void) { char moji1[61]; char moji2[61]; printf("文字列Aを入力===>"); scanf("%60s" ,&moji1); printf("文字列Bを入力===>"); scanf("%60s" ,&moji2); if(moji1-moji2>0){ printf("===AはBより大きい===\n"); } else if(moji1-moji2<0){ printf("===AはBより小さい===\n"); } else if(moji1-moji2==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y){ if(*x=='\0') return 0; x++; y++; } return (*x-*y); }

  • printfを代入する?

    #include <stdio.h> int main(void) { int kaerichi,nyuuryokumoji; char moji[40]; printf("\n数字を入力してください:"); scanf("%d",&nyuuryokumoji); kaerichi=printf("%d",nyuuryokumoji); printf("\n入力数字の桁数は%dです\n",kaerichi); printf("\n文字を入力してください:"); scanf("%s",&moji); kaerichi=printf("%s",moji); printf("\n入力された文字は%dです\n",kaerichi); return(0); } このプログラムでkaerichi=print("d",nyuuryokumoji); とありますがどういう意味でしょうか? 変数に数字などを入れるのはわかるのですが printfをいれるというのがあまりよくわかりません あとどうして桁数がでるのでしょうか?

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

  • 文字の数値化 関数化

    文字を入力されたとき、数値入力を促す関数を作りたいのですが、 最初の文字が文字ならエラーメッセージがちゃんと出るのですが、 最初の文字が数字ならエラーメッセージが出てくれません。 アドバイスお願いいたします。 tew2 ← エラー出る 2test ← エラー出ない #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> float ss_input(void); int main(){ int i; int pop; printf("何人の入力しますか(3人以内)->"); do{ pop=ss_input(); if(pop >3) printf("3人以内でお願いします\n"); }while(pop<1 || pop>3); return 0; } float ss_input(void){ char p[100]; float st; int i=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("数値を入力してください->"); scanf("%s",p); continue; } else{ break; } } st=atof(p); return st; }

  • 関数の作り方

    文字列s1に文字列s2が含まれるか判定する関数search を作りたいのですが、コンパイルできません。 どこに問題がありますか?? #include<stdio.h> #include<string.h> int seach(char *s1,char *s2) { char *p; p = strstr(s1,s2); if(p == NULL){ return 0; }else{ return 1; } } main(void){ char s1[255]; char s2[255]; int res; printf("文字列s1を入力:"); scanf("%s",s1); printf("文字列s2を入力:"); scanf("%s",s2); res = search(s1,s2); if(res == 1){ printf("文字列s1に文字列s2が含まれます\n"); } if(res == 0){ printf("文字列s1に文字列f2は含まれません\n"); } return 0; }

  • ループのとめ方

    入力した文字を小文字から大文字に 変えるプログラムで、コントロール+z で、ループを抜け出すようにしたい。 連続して2度コントロール+zを 押さないととまらないのですが、 どのようにすれば、1度コントロール+zを 押すだけで、終了できるのでしょうか? 何かアドバイスをお願いします。 ======================================== #include <stdio.h> #include <ctype.h> #include <string.h> int main(void) { char moji[50],check=0; int i,len; while(check !=EOF){  printf("Enter : ");  check = scanf("%s",moji);  len=strlen(moji);  if(check!=EOF){   printf("Display : ");   for(i=0;i<len;i++){     printf("%c",toupper(moji[i]));   } } } return 0;

  • 配列とポインタを使って特定の文字だけ大文字にする

    配列とポインタを使って特定の文字だけ大文字にするプログラムを作りたいのですがどのように作ればいいのでしょうか? 例えば、sportsのsだけ判別してSportSというふうにしたいです。 一応以下のようなプログラムを作ったのですが、実行してもsportsのままで何も変わりません・・・。 #include<stdio.h> void mojihenkan(char *); main(void) { char moji[8]={"sports"}; char *p; int i; mojihenkan(moji); p=moji; for(i=0;i<8;i++){ printf("%c",*(p+i)); } return 0; } void mojihenkan(char *a) { int i; for(i=0;i<8;i++){ if(*(a+i)=='s'){ a-32; } } }

  • 質問です。

    このソースのscanf("%*c%c",&moji);の部分が分かりません。"%*c%c"はどういう意味があるのですか?また、。"%*c%c"と%cの違いは何ですか?教えてください。宜しくお願いします。 #include <stdio.h> int main(void) { char moji; printf("文字を入力 (終了するときは/) -->"); scanf("%c",&moji); for(;;){ if(moji!='/'){ printf("文字 = %2c\n",moji); printf("10進 = %2d\n",moji); printf("16進 = %2x\n",moji); printf("文字を入力 (終了するときは/)-->"); scanf("%*c%c",&moji); } else{ printf("プログラムを終了します"); break; } } return 0; }

専門家に質問してみよう