2010-12-03 5 views
1

私はC++の学習を始めます。なぜプログラムから飛び出したのですか?

私のコードを実行すると、プログラムから何のエラーもなく飛び出します。どうして?

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    char s1[20],s2[10]; 
    cout<<" enter a number : "; 
    cin.get(s1,19); 
    cout<<" enter a number : "; 
    cin.get(s2,9); 

    cout<<s1<<"/n"<<s2; 

    getch(); 

} 
+0

「プログラムから飛び出している」とはどういう意味ですか?つまり、あなたはopn s1とs2のものを入力しないということですか? – Muggen

+2

最初に、 '' stdafx.h ''や' _tmain'のような、C++の悪い拡張機能を使用するのはなぜですか? –

+1

Dude。あなたは確かにそれをコンパイルしますか?それは私のVS2008ではありません。 getch()には何を含めるのですか? – Muggen

答えて

6

get()メソッドは '\ n'文字まで読み込みますが、それを抽出しません。 122345<enter>
このライン:

あなたが入力している場合

cin.get(s1,19); 

12345を読みますが、しかし(<が>を入力して押すことによって作成された)は '\ n' が入力ストリームに残されています。したがって、次の行は次のようになります。

cin.get(s2,9); 

「\ n」が表示されて停止するため、何も表示されません。しかし、 '\ n'も抽出しません。したがって、入力ストリームにはまだ '\ n'があります。だからこの行:

getch(); 

ちょうど入力ストリームから '\ n'文字を読み取ります。その後、処理を終了してプログラムを正常に終了させることができます。

OK。それが起こっていることです。しかし、これ以上のことがあります。書式付き入力を読み込むにはget()を使用しないでください。フォーマットされたデータを正しいタイプに読み込むには、演算子>>を使用します。

int main() 
{ 
    int x; 
    std::cin >> x; // Reads a number into x 
        // error if the input stream does not contain a number. 
} 

のstd :: cinをあなたは<は>を入力して、ストリームのフラッシュ押すまで、データがプログラムに送られていないバッファされたストリームであるため。したがって、一度に1行のテキストを(ユーザー入力から)読み込んでから、その行を個別に解析すると便利なことがよくあります。これにより、エラーの最後のユーザー入力を確認することができます(行単位で行をベースにし、エラーがあればそれを拒否します)。

int main() 
{ 
    bool inputGood = false; 
    do 
    { 
     std::string line; 
     std::getline(std::cin, line); // Read a user line (throws away the '\n') 

     std::stringstream data(line); 
     int x; 
     data >> x;     // Reads an integer from your line. 
            // If the input is not a number then data is set 
            // into error mode (note the std::cin as in example 
            // one above). 
     inputGood = data.good(); 
    } 
    while(!inputGood); // Force user to do input again if there was an error. 

} 

さらに進歩したければ、さらにブーストライブラリを見ることもできます。彼らは一般的に良いコードを提供し、C++プログラムとしてはboostの内容を知っておくべきです。あなたは次の入力を取得する前に、ストリームから改行文字を無視するcin.ignore();を使用する必要が

int main() 
{ 
    bool inputGood = false; 
    do 
    { 
     try 
     { 
      std::string line; 
      std::getline(std::cin, line); // Read a user line (throws away the '\n') 

      int x = boost::lexical_cast<int>(line); 
      inputGood = true;    // If we get here then lexical_cast worked. 
     } 
     catch(...) { /* Throw away the lexical_cast exception. Thus forcing a loop */ } 
    } 
    while(!inputGood); // Force user to do input again if there was an error. 

} 
+0

+1 を入力 neato –

1

:しかし、我々は、上記のように再書き込みすることができます。

+2

「ストリームをフラッシュする」が間違っています。 – meagar

+0

@maxim、@ Dave18:これをしないでください。数字の解析を難しくしています(特に、ユーザーが数字を入力しない場合)。数字を読むには、演算子>>を使用する必要があります –

関連する問題