C++で文字を置換する関数を作成する方法

このQ&Aのポイント
  • C++で文字を置換する関数を作成する方法について教えてください。
  • 現在じゃんけんさせるプログラムを作成しているのですが、文字を置換する関数を作りたいです。
  • 作成した関数を使用して、じゃんけんの結果を表示するプログラムも作りたいです。
回答を見る
  • ベストアンサー

C++(というよりC)で文字を置換

現在じゃんけんさせるプログラムを作っています。その中で 0→ぐー 1→ちょき 2→パー のように変換してreturnさせる関数を作りたいのです。 現状作ったファイルをコンパイルすると VisualStudioだと エラー 1 error C2440: 'return' : 'char [20]' から 'int' に変換できません。 27 1 じゃんけん・改 2 IntelliSense: 戻り値の型が関数型と一致していません 27 9 じゃんけん・改 g++だと In function 'int Replacement(int)': 19:20: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] char *Replaced = "パー"; ^ 22:20: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] char *Replaced = "ちょき"; ^ 25:20: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] char *Replaced = "ぐー"; ^ 27:9: error: invalid conversion from 'char*' to 'int' [-fpermissive] return Replaced; ^ 17:7: warning: address of local variable 'Replaced' returned [-Wreturn-local-addr] char Replaced[20] = { 0 }; ^ In function 'int main()': 60:27: error: 'scanf_s' was not declared in this scope scanf_s("%d", &player_c); とエラーやら警告がでます。g++のscanf_sのエラーはscanfにすればいいので気にしないとして、どうすれば目的の関数が作れますか? [ソース抜粋] int Replacement(int ver){ char Replaced[20] = { 0 }; if (ver == 2){ char *Replaced = "パー"; } else if (ver == 1){ char *Replaced = "ちょき"; } else{ char *Replaced = "ぐー"; } return Replaced; /*switch (ver){ case 2: char *Replaced = "パー"; return Replaced; break; case 1: char *Replaced = "ちょき"; break; default: char *Replaced = "ぐー"; break; }*/ } void Which_is_Winner(int player_c,int cpu_c, int Judge_Which_is_Winner){ printf("じゃんけん・・・・・・ポンっ!\n"); printf("あなた:%s\nCPU:%s\nじゃんけん", Replacement(player_c), Replacement(cpu_c));//それぞれの手を表示 if (player_c == Judge_Which_is_Winner){ printf("あなたの勝ちです!\n"); } else { printf("cpuの勝ちです!\n"); } }

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

  • ベストアンサー
  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.7

C言語の関数の戻りとして文字列を返す場合、安全を考えるなら 文字列リテラルをそのまま返す形式 char* 朝の挨拶() { return "んちゃ!"; } 文字列バッファを引数で受けて編集する形式 char* 夜の挨拶(char* buff) { return sprintf(buff, "%sちゃ!", "バイ"); } のどちらかを使います。 グローバル変数とか静的変数を使う方式もありますが、 これは不可解なバグを引き起こしやすいのでお勧めできません。 というわけで今回のケースならば、 文字列リテラル(のポインタ)を返す形式が適してるかと思います。 char* Replacement(int ver){ char* Replaced; if (ver == 2) Replaced = "パー"; else if (ver == 1) Replaced = "ちょき"; else Replaced = "ぐー"; return Replaced; }

yumewiki
質問者

お礼

ありがとうございます。それで成功しました。 {}もいけなかったんだな・・・。 No.3さんの回答が理解できていないため、この質問をクローズするのはもう少し後に致します。

その他の回答 (7)

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.8

>なぜそれではダメなのか、よくわからないです。 #4,#7の方が説明されていますから、それらをよく読んで考えてみてください。

yumewiki
質問者

お礼

やっとなんとか分かったと思います・・・多分。 これからも頑張ります。

  • honor
  • ベストアンサー率35% (25/71)
回答No.6

関数の戻り値型をconst char*にして それぞれのifブロック内で文字列をそのままreturnする、とか。

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

そもそも Replaced がいらんのか.

回答No.4

C#はちょっと置いといて、これがCなら、 { char*Replaced = "ぐう"; } この場合、中括弧を抜けた時にchar*のReplacedは、消滅します。 意識しない人が多いですが、中括弧は新たなスコープを引き起こします。 だからそこで宣言char *Replacedが有効なのです。(C99ではどこでもOKらしいですが) これ動くようにするには、各中括弧の中のchar*Replaced = "*" の部分をstrcpy(Replaced,"*")にして、 char Replaced[20]={0};の前にstaticを付けるべきでしょう。 あ、もちろん関数の戻り値もchar*にする必要があります。

yumewiki
質問者

お礼

スコープ・・・、勉強になりました。 ついでにいうと私のポインタの理解もあやふやですね・・・。 c#といいますと、c++の話をしていたと思うのですが、なぜ出てきたのでしょうか?

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.3

関数の戻り値の型と実際に返してる型が異なるので合わせる必要があります。 ただし char *Replacement(int ver){ とするだけではダメです。

yumewiki
質問者

補足

なぜそれではダメなのか、よくわからないです。 どうやって調べればいいのでしょうか?

回答No.2

関数定義の1行目、戻り値の型を変えて char* Replacement(int ver){ にする。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

int Replacement(int ver){ ↑ 最初にintと指定しているのに、returnがchar *Replacedで、 型が違うって言っているのです。

関連するQ&A

  • C++ scanfで止まらない

    いつもお世話になっております。 最近C++を勉強し始めたばかりで、初心者丸出しの質問になってしまうと思うのですがひとつよろしくお願いします。 本を見ながらじゃんけんゲームを作っていて、サンプルとは別に自分で考えて作ってみたのですが、scanfの挙動がどうも思い通りにいきません。 以下がソースです。 int testJanken() {     int player=0;     int computer;     printf("【じゃんけんゲーム】\n");     printf("じゃんけん・・・(グー:1 チョキ:2 パー:3 終了:9)>");     scanf("%d",&player);    //入力受付     while(player!=9)     {         if(0<player&&player<=3)         {             printf("\nあなたは:");             showTe(player);                          srand(time(NULL));             computer=rand()%3+1;             printf("コンピューターは:");             showTe(computer);             showShouhai(player,computer);         }         else         {             printf("\n----------1~3,または9の値を入れてください!---------\n");         }         printf("\nじゃんけん・・・(グー:1 チョキ:2 パー:3 終了:0)>");         player=0;         scanf("%d",&player);    //入力受付     }     printf("\nバイバイー!!");     return 0; } //勝敗決定表示 int showShouhai(int player, int computer) {     if(player==computer)     {         printf("あいこ!\n");         return 0;     }     else if((player+1==computer)||(player-2==computer))     {         printf("あなたの勝ち!\n");         return 1;     }     else     {         printf("コンピューターの勝ち・・・\n");         return 2;     } } //入力値からグーチョキパーを文字列で表示させる int showTe(int su) {     switch(su)     {         case 1:             printf("グー!\n");             break;         case 2:             printf("チョキ!\n");             break;         case 3:             printf("パー!\n");             break;         default:             printf("???\n");             break;     }     return 0; } 【実現したい仕様はこちら】 1)じゃんけんの手(1,2,3のどれか)を入れれば通常通りじゃんけんが行われ、結果が表示される。 2)9が入力されたら終了 3)1,2,3,9以外が入力されたらメッセージの表示 この3がうまくいきません。 制御できないのは文字を入力した場合なのですが、例えばaと入力するとそれ以降永久ループとなり抜け出せなくなってしまいます・・・ ネットであちこち原因を調べてみたのですが、探し方が悪いのか解決策がわかりません・・・ 今後の勉強のためにも原因と解決策を詳しく教えて頂けると嬉しいです。 よろしくお願いします。

  • C言語初心者です。 ジャンケンゲーム

    今、授業の課題でジャンケンゲームを作成していますが、なかなかできません。もし、良かったら何処が違うのか教えてください。 // main.c #include <stdio.h> #include <time.h> //#include <time.h> #include "my.h" main(int argc, char* argv[]){ int i; char s[7]; printf("これはジャンケンゲームです。\n"); printf("手を入力します(グー:1 チョキ:2 パー:3)\n"); scanf("%s",&s[7]); srand((unsigned)time(NULL)); printf("%s\n",jyan(dice(3))); if(s == jyan){ printf("あいこです。\n"); }else if(s == 1 && jyan ==2){ printf("あなたの勝ちです。\n"); }else if(s == 2 && jyan == 3){ printf("あなたの勝ちです。\n"); }else if(s == 3 && jyan ==1){ printf("あなたの勝ちです。\n"); }else{ printf("コンピュターの勝ちです。\n"); } } // dice.c #include <time.h> int dice(int n){ srand((unsigned)time(NULL)); return(rand()%n+1); } // jyan.c char *jyan(int n){ static char s[][7]={"グー","チョキ","パー"}; return s[--n]; } // my.h #include <stdio.h> char *jyan(int hand); //int dice(int n); 見づらくて申し訳ありません。4つのファイルに分けて作成しています。上記のプログラムだと自分の手、コンピューターの手がランダムに出てくるのですが判定が出来ませんでした。アドバイス、よろしくお願いします。 長文になってしまい申し訳ありません。

  • 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言語の初心者です。これを実行してみてください。

    「a」って打ち込んだら「a」ってでましたか? #include<stdio.h> int main(void){ char a; printf("aaa\n"); scanf_s("%c", &a); printf("%c", a); return 0; }

  • C言語文字数4つカウント

    こんにちは。大学の課題で「キーボードから入力した文字数に含まれる'h''o''g''e'の4つの文字数をカウントする関数を含むプログラムを完成させよ」という課題がありました。なかなかできず現段階では以下のようになっています。どうすれば問題文のように実行できますか? #include <stdio.h> char str_chnum(const char str[], int ch) { int count = 0; int i; for(i = 0; str[i] != '\0'; i++) { if(str[i] == ch) count++; } return(count); } int main(void) { char str[128]; int ch; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &ch); printf("%cは%d個ありました。\n", ch, str_chnum(str, ch)); return(0); }

  • 文字列strの中から文字cを探すプログラム(C言語)がわからない

    文字列strの中から文字cを探すプログラム(C言語)がわからない 柴田望洋さんの「[新版]明解C言語」という本の演習11-2なんですがどうしてもわかりません。間違いは無いと思うのにコンパイルすると警告を吐かれます。 僕が書いたプログラムを載せます。 /* 文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、 その文字へのポインタを返し、含まれていなければNULLを返す関数 char *str_chr(const char *str, int c) {} を作成せよ。 */ #include<stdio.h> char *str_chr(const char *str, int c){ while(*str){ if(*str==c) return str; str++; }     return NULL; } int main(){ char *str; char c; scanf("%s",str); scanf(" %c",c);     printf("%d",str_chr(str,c)); return 0; } コンパイラは「関数str_chrのif分の中のreturn strの型変換に問題がある」と言っているんです。 型変換はしるつもりは無いのにコンパイラはなぜそのように認識するのでしょうか。 またネット答えを探しましたがどうやらこのreturn strの部分はreturn (char*)strが正解のようです。意味がわかりません。strはポインタなのになぜまたわざわざchar型に変換しているのですか?といか(char*)の意味が根本的にわかりません。 質問ばかりですみません。初心者でポインタがどうにも理解できないんです。 誰か詳しい人教えてください。 お願いします。

  • c言語のポインタへの文字列入力についてです。

    当方c言語初学者なのですがscanfを使ってポインタに文字列を入力したいのですがバグが発生して進みません・・・どういうことなのでしょうか? #include <stdio.h> int main(void) { char *a; scanf("%s", a); printf("%s", a); return (0); } *aをa[128]; のように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)

  • C++言語について。構文エラー

    ジャンケンゲームを作ってたんですが サイトを参考にしながらやってたんですが、どこかでミスったみたいで。 コピーしてやるのはイヤなので、自分で打ちたいんです。   どうか間違いを指摘してもらえないでしょうか?            #include <stdio.h> #include <stdlib.h> int main() { int n; int p;//player int c;//computer srand(0);//乱数の初期化 do { //プレイヤーの手 printf("あなたの手を入力してください\n(グー:1、チョキ:2、パー:3\n"); scanf("%d", &p); //コンピュータの手 c = rand() % 3 + 1; //勝ち負け判定 if(p == c){ printf("draw\n"); }else if(p == 1 && c == 2){ printf("WIN!!\n"); }else if(p == 2 && c == 3){ printf("WIN!!\n"); }else if(p == 3 && c == 2){ printf("WIN!!\n"); }else{ printf("lose...\n"); } //続けるかどうかの判定 printf("try agin?\nNO(0を入力)---"); scanf("%d", &n); //nが0以外だったら続ける }while(n != 0); return 0; }        で、エラーが構文エラー : ';' が 'return' の前にありません。 というものでした。   よろしくおねがいします。

  • C言語について

    C言語のじゃんけんゲームを作成したいのですが、 仕様は 1.利用者とコンピュータによる対戦形式とします。 2.利用者がキーボードから入力した手(グー・チョキ・パー)と、擬似乱数を用いて生成したコンピュータの手を比較し、利用者の勝ち・あいこ・負けの結果を表示しなさい。 3.利用者の入力が不正の場合には再度入力を促すなど、適切な処理をしなさい。 4.これまでの累積勝利数・引き分け数・敗北数をそれぞれ、user_win・user_draw・user_loseの3つの変数(int型)に格納しなさい。 5.連勝中の場合は「5連勝中!」などと表示させるようにしなさい。 6.あいこである限りは自動的にじゃんけんを反復しなさい。 7.勝敗がついた場合、利用者にまだ継続するか質問した上で、じゃんけんを反復させなさい。 8.じゃんけんを終了した場合、これまでの通算成績として、累積勝利数・引き分け数・敗北数のほか、勝利=累積勝利数÷(累積勝利数+累積敗北数)×100、および、最大勝利数を計算して表示しなさい。 という仕様のじゃんけんゲームを作成したいのですが、下記に書いているまでしかできません。誰か教えていただけないでしょうか。分からなくて困っています。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int a,c; srand(time(NULL)); c = rand()%3+1; printf("手を入力してください [1:グー 2:チョキ 3:パー] "); scanf("%d",&a); if(a==1 && c==1) printf("あなたはグーで、私もグーでした。アイコです。\n"); else if(a==1 && c==2) printf("あなたはグーで、私はチョキでした。あなたの勝ちです。\n"); else if(a==1 && c==3) printf("あなたはグーで、私はパーでした。あなたの負けです。\n"); else if(a==2 && c==1) printf("あなたはチョキで、私はグーでした。あなたの負けです。\n"); else if(a==2 && c==2) printf("あなたはチョキで、私もチョキでした。アイコです。\n"); else if(a==2 && c==3) printf("あなたはチョキで、私はパーでした。あなたの勝ちです。\n"); else if(a==3 && c==1) printf("あなたはパーで、私はグーでした。あなたの勝ちです。\n"); else if(a==3 && c==2) printf("あなたはパーで、私はチョキでした。あなたの負けです。\n"); else if(a==3 && c==3) printf("あなたはパーで、私もパーでした。アイコです。\n"); else printf("正しい手を入れてください。\n"); return 0; }

  • C言語 ポインタと配列

    #include <stdio.h> /* scanf("%c", &search); ではなく scanf(" %c", &search); であることに注意する */ char *str_chr(const char *str, char c) { char *find; find = NULL; do { if(*str == c) { find = (char*)str; break; } } while(*str++); return(find); } int main(void) { char str[100] = {0}; char search; char *find; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &search); find = str_chr(str, search); if(find == NULL) { puts("検索した文字は見つかりませんでした。"); } else { printf("検索した文字 %c は\"%p\"にあります。\n", *find , find); } return(0); } このコードのfind = (char*)str;の (char*)str;の部分がどうなっているのかわかりません。 あとこのfindというのは&find[0]という解釈でいいでしょうか? 教えてくださいm(_ _ )m

専門家に質問してみよう