none
突然C++で"cin"が使えなくなった!? RRS feed

  • 質問

  • ① 「Visual C++ 2010」で学習中です。「配列を動的に確保する」プログラムをRunさせたところ、エラーメッセージが出ないにも関わらず、"cin>>a"が記された箇所の入力場面で、整数を(int a;とした)入力しEnterすると、コードが書かれた画面に戻ってしまいます。何回書き直しても同じ現象です。

    ② それまでに"cin"を含めて書いたプログラムは、すべて正常に動きます。

    ③ ①のプログラムも、"cin"を削除すると、特に"cout"も含めてすべて正常に動きます。

    ④ 因みに①と同じプログラムを「VisualC++2008」で書いたものは正常に動きます。

    何が原因で、どうしたものか?お助けください。

    OS:Windows7 Home Premium

    文字入力:ATOK 2012

    2012年5月21日 7:11

回答

すべての返信

  • 「コードが書かれた画面に戻る」というのは、どういう状況なのでしょうか?
    デバッグ実行していると、cin の箇所でキーボード入力をした途端に、アプリケーションがクラッシュしている状態なんでしょうか?
    セオリーからすると、「配列を動的に確保する」ところを真っ先に疑うのではないかと思います。スタック領域なんかを破壊しているんではないかと。

    2012年5月21日 9:42
  • cinの箇所にブレークポイントがあったりして...。
    2008では正常に動くとの事ですが、本当に全く同じコードですか?
    2012年5月21日 9:55
  • ① 「コードが書かれた画面に戻る」というのは, 数値を入力しENTERキーを押したとたんに、「*.cpp」 の画面になってしまうということです。

    ② 「2008では正常に動くとの事ですが、本当に全く同じコードですか?」→2008のコードをコピーしたので全く同じです。

    ③ 「スタック領域なんかを破壊しているんでは?」とのことですが、それまでに作ったプログラムは「cin」の処でも正常に実行しているのです。


    occunn

    2012年5月21日 13:17
  • ① 「コードが書かれた画面に戻る」というのは, 数値を入力しENTERキーを押したとたんに、「*.cpp」 の画面になってしまうということです。


    結局のところ何が発生しているのでしょうか?
    アプリケーションがクラッシュして終了しているんでしょうか?あるいは、例外でブレークしているんでしょうか?それとも、それ以外の状態なんでしょうか?

    ② 「2008では正常に動くとの事ですが、本当に全く同じコードですか?」→2008のコードをコピーしたので全く同じです。

    ③ 「スタック領域なんかを破壊しているんでは?」とのことですが、それまでに作ったプログラムは「cin」の処でも正常に実行しているのです。


    「配列を動的に確保する」部分に問題がある場合、メモリ領域やスタック領域を破壊することによって、cin の処理を実行するところで問題が顕在化する可能性は十分に考えられます。
    また、2008 のコードをコピーしたとのことですが、メモリ領域やスタック領域の破壊というのは、一見正常に動作してしまったように見えただけで、開発環境が変わったことにより問題が顕在化したということも考えられます。
    2012年5月21日 15:08
  • いっそのこと、「配列を動的に確保する」の出典を明らかにした上で、質問文にソースコードを挙げてみてはどうでしょうか? (短いようなら全文)

    それによりサンプルが間違っているのか、それともOccunnさんの操作が間違っているのかが判断できます。

    2012年5月21日 23:28
  • 多分、いろいろと書くべきことが抜けているので話が伝わらないのだと思います。

    文字のみでやり取りを行う掲示板の場合、質問者が書いたことが全てです。
    プログラムの内容等、察することは出来ないのできちんと提示しないといけません。
    まず、作成したプログラムは勉強用のテストプログラムのようなものだと思うので数十行程度の内容でしたら
    掲示板上に提示してしまった方が話が早い場合が多いです。
    100行を超えるようなものであれば、状況が再現する最小限のコードを用意して提示する必要がありますが、
    今回の場合はいかがでしょうか?

    あと、あなたがそのプログラムを実行した時にどういう手順で実行したのかも必要ですよ。
    デバッグ実行なのか、デバッグせずに実行なのかとか。
    とにかくあなたがやった事を全て説明してもらわないとこちらからは何も見えません。
    ちょっと詳しすぎるのではと思うくらい説明してちょうど良いくらいだと思ってください。
    開発環境の使い方に関しても勉強してくださいね。
    この辺の用語とかは、起こっている状態を的確に説明するために必要なのです。
    で、文字のみでやり取りを行う掲示板では、この用語の知識は必要な知識になります。
    ソースが表示されている画面になるにしても、ブレイクポイントが設定されているから切り替わっているのと、
    プログラムの不具合の為に強制的にブレイクが掛かっているのとでは話が違ってきますよ。
    「ブレイクポイント」とか「ブレイクが掛かる」とかそういう用語についても勉強してくださいね。

    あと、プログラムと言うのはたまたま動いていると言うケースがあるのでそれまでに作ったプログラムにしても
    もしかするとプログラムミスがあるまま動いている可能性があります。
    なので今まで動いていたと言う部分にあまり頼りすぎない方が良いです。
    プログラムのソースを見直してその上で論理的に大丈夫と確認が取れていれば良いのですけれど。

    ちなみに「スタック領域なんかを破壊しているんでは?」と言うのは単純に言うとプログラムミスを予想した発言です。
    どういうミスをしているかはソースを確認してないとわかりませんが、ソース上にミスがあると起こりうる現象です。
    詳しい内容に関してはメモリの扱いとかもろもろ勉強が必要です。

    まだ勉強中なんだと思うのでいっぺんには無理だと思いますけれど、
    一つ一つ勉強していってください。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。

    2012年5月22日 0:35
  • ①書いたコードは次のとうりです。

    #include<iostream>
    using namespsce std;

    int main()
    {
     int a;

     cout<<"整数を入力してください。¥n";
     cin>>a;
     cout<<a<<"と入力されました。¥n";

     getchar();
     return 0;
    }

    ②「cin」で入力待ちの時に整数を入力して「Enter」キーを押すと、コードが書かれた画面(私の場合)「CinNyuryoku.cpp」になってしまいます。

    ③「デバッグして実行」「デバッグしないで実行」「ビルドし直し」「設定のし直し」の何れを実行しても②の状態になります。

    ④さらに悩ましいのは、今まで書いた「cin」を含むすべてのプログラムは正常に作動します。

    ⑤「int a=500;」「// cin>>a」として実行すると、
     「 
      整数を入力してください。
      500と入力されました。
                  」
      と実行されます。従って偏に新しく記述した「cin」の問題だと思われますが、どうしてもその原因が分かりません


    occunn

    2012年5月25日 14:41
  • 「配列を動的に確保する」ところがどこかわからないのですが...

    たぶんgetcharのところで入力待ちにしたいんですよね?

    入力バッファに改行コードが残っているので、何も入力しなくてもgetcharがリターンしてコンソールが閉じるんです。

    getchar();

    となっているところを

    rewind(stdin);
    getchar();

    私の環境(Widnows 7 64bit + VC++ 2010)ではこれでgetcharのところで入力待ちになります。

    VC++ 2008だとrewindなしで入力待ちになるんですか?2008の方が変だと思いますよ。

    それから、

    cout<<"整数を入力してください。¥n";
    cin>>a;
    cout<<a<<"と入力されました。¥n";

    ではなく、

     cout<<"整数を入力してください。" << endl;
     cin>>a;
     cout<<a<<"と入力されました。" << endl;
    

    ですよね?

    using namespsce std;

    ここコンパイル通りませんよ。

    using namespace std;
    

    ですよね?

    正確な情報を投降しないと回答出来るものもできなくなってしまいますよ。

    2012年5月25日 15:40
  • プログラムが正常に終了して閉じているだけなので、「画面が戻る」「cin がうまく動いていない」というのは誤解ですね。
    コンソールアプリケーションが終了しても自動的に閉じずに見たいのであれば、Ctrl+F5(デバッグなしで実行)を使ってみるとよいでしょう。getchar などを書かなくても自動的に閉じなくなります。
    (ただし、「デバッグなしで実行」なので当然デバッグできませんが)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    2012年5月26日 0:09
    モデレータ
  • 投稿するフォーラムをお間違えのようですが、このスレッドの続きです。

    再度C++でのcinの問題
    http://social.technet.microsoft.com/Forums/ja-JP/onlineservicesjp/thread/17737caa-c495-4278-aab0-c12ad0784211/#17737caa-c495-4278-aab0-c12ad0784211
    • 回答としてマーク 山本春海 2012年5月28日 1:35
    2012年5月26日 9:20