- 締切済み
c++について
入力した値が123または456で一致したら一致と表示したいのですがどうfor文を回すか分かりません。 ご助力願います_(._.)_ class N { bool hit(const char* a[],const char* b) { for(int i=0;i<*a[i];i++) if(*a[i]!=b[i]) { return false; } return true ; } public: N() { const char* a[ ]={ "123","456"}; char b[4]; int num; cin>>num; sprintf_s(b, 4, "%03d", num); if(hit(a,b)) cout<<"一致"; else cout<<"不一致"; } };
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- AsarKingChang
- ベストアンサー率46% (3467/7474)
私なら、 const char* a[ ]={ "123","456"}; ここを const char* a[ ]={ "123","456",null}; として、DEMを追加しますね。 その上でhit()では、 int index=0; while( a[index] ) { if ( strlen(a[index]==strlen(b) && !strcmp(a[index],b) ) return(true); index++; } return(false); としますね。 最後のnullでwhileを抜ける感じ+ 文字の長さが同じで+文字の内容も同じ=true
- asciiz
- ベストアンサー率70% (6821/9700)
まずはfor分のループ変数、iの判定がおかしいです。 *a[i] には1や2が入っているわけではなく、何らかのメモリ上の値を参照してしまうので、何十・何千・何万回とループしてしまう可能性があります。 aに入っている値ではなく、aの「要素数」でループするべきですよね。 しかしC言語・C++言語は、配列変数自体には配列の大きさが記録されておらず、配列をはみ出さないように使うのはプログラマの責任であるのです。 きちんと配列の要素数だけ、forループするようにしてください。 >C++で静的配列の要素数を求めるテンプレート関数 | TECHSCORE BLOG >https://www.techscore.com/blog/2013/02/08/how-to-calculate-array-length-in-c-and-cpp/ (まあ上記も難しいので、とりあえず for (i=0; i<2; i++) とか書きましょう。要素数を増やす段になったら上記ページ方式への書き換えをしてみてください) しかしたまたま、ご質問のhit()関数の書き方では、最初の1つ目を比較しただけで、trueまたはfalseをもってreturnしてしまいます。 おかげで、無限ループには陥りません。 でも、正常な動作もできていません。 hit関数内で、「比較フラグ」の変数を用意しましょう。 そして最初は false に初期化しておきます。 (例: bool flag = false;) for 内の if文で、一致したものが見つかれば、 flag = true; として代入します。 一致しなければ何もしません。 forループを終えた後、return flag; とします。 そうすれば、一つでも一致したものが見つかれば true が返り、一致するものが無ければ最初に false に初期化したまま、false が返ることになります。
補足
二重ループを使って解けました(^^)