- ベストアンサー
【至急】予想通りの結果が得られません。
下記のプログラム(C++)を実行しようとすると、以下の2と3の間で止まります。 1、「_/_/_/_/...」が表示される。 ↓ 2、「Hideaki...」が表示される。 ↓ 3、ユーザに性別(sex)の入力をさせる。 =停止(反応なし)= ↓ 4、継承クラスのWizardが「"Fire"を放つ」と表示される(はず・・・。 #include <stdio.h> #include <cstring> #include <cstdlib> #include <ctime> // if をたくさん使いたい // 所持金をつかったジョブシステムでゲーム // 所持金をメダルや経験値や武器・防具に交換できる struct Hajimete_no_struct { int i; char str; }; class BaseCharacter { protected: char name[200]; private: char sex[200]; //int HP; int EXP; char weapon[200]; char protector[200]; public: BaseCharacter(void){} void speak(const char speaker[200], const char speakThis[200]) { printf("%s:%s\n",speaker, speakThis); } }; BaseCharacter* p; class Wizard : public BaseCharacter { int MP; public: Wizard (void){} void magic(const char magicThis[200]) { printf("%s:%sを放つ", name, magicThis); } }; // ******************************************************************** // SimpleFunstion // ******************************************************************** void Start(void); void Start(void){ printf("\n\n\n_/_/_/_/_/_/_/_/_/_/_/_/_/_/\n = Fantasy =\n_/_/_/_/_/_/_/_/_/_/_/_/_/_/\n\n\n");} // sex void Ask01(void);int i; void Ask01(void){ printf("[ 1.woman 2.man ]\nChoose this sex:");scanf("%d", &i); printf("Your selection : %d\n",i); if (i == 1) { printf("1.woman\n"); }else if(i == 2){ printf("2.man\n"); }else { printf("Please select from 1 or 2.\n"); Ask01();} } // ******************************************************************** // intMain // ******************************************************************** int main(void) { Start(); BaseCharacter human01; human01.speak("Hideaki", "My name is Hideaki."); Ask01();//sex !This function will not use so destroy. Wizard human02; human02.magic("Fire"); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
私のところでやったらその順番で実行できましたが? 可能性としては、 > printf("[ 1.woman 2.man ]\nChoose this sex:"); がバッファリングされて、実際に「画面」には出力されていないまま、scanfの入力待ちになった、というところでしょう。 printf("[ 1.woman 2.man ]\nChoose this sex:"); fflush(stout); scanf("%d", &i); とでもしたら? あとは、細かいことかもしれないですが、後に問題になりそうなものがいっぱいあります。 > void Ask01(void);int i; > void Ask01(void){ printf("[ 1.woman 2.man ]\nChoose this sex:");scanf("%d", &i); ・この int i ではグローバル変数になることに気付いてますか? ・使う前に定義するなら、プロトタイプ宣言は不要です。 ・(コーディングスタイルの問題になるけど) 1行には1命令以上書かない方がよいです。 例えば、こんな風 void Ask01(void){ int i; printf("[ 1.woman 2.man ]\nChoose this sex:"); scanf("%d", &i); それとか ・せっかく性別入力したのに、どこにも保存していない。 ・「// if をたくさん使いたい」ってあるけど、ifばかりだとプログラムが複雑になってわかりずらい。 ・char [200]を沢山使ってるけど、こういうのはtypedefするとか#define でSTR_MAXみたいな意味のある名前を付けるのが常套手段 ・C++使うなら、std::stringとかもっと便利なクラスもある。 ・stdoutは画面じゃないし、stdinはキーボードでもない。ゲームとして作るなら、ちゃんとキーボードから入力して画面に出力するようなしくみを使った方がよいのでは(ncurcesライブラリとか)
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
あと、 nameに何も入れてないから、 > void magic(const char magicThis[200]) >{ > printf("%s:%sを放つ", name, magicThis); > } ここでnameをprintfで出力しようとして思わぬことが起る可能性はあります。
お礼
表示されなかったですね。ありがとうございました。またみかけたときはお願いします。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
Ask01()からどうやって抜けるんだろう...
お礼
ありがとうございました。またみかけたときはお願いします。
補足
int main()の Wizard human02; human02.magic("Fire"); を外せば、正常に働くんですよ。 しかも、その際、1か2と入力すれば抜けられました。
お礼
sizeef(?)でも明確なサイズを指定できるのでしょうか。 ありがとうございました。またみかけたときはお願いします。