2017-01-31 16 views
4
int main() 
{  
    char a[101]; 
    cout << "str a:"; 
    gets(a); 
    return 0; 
} 

ここではcout<<"str a:";より前に実行されていますか?制御の流れC++

コンパイラはデジタルマーズとGNN_gccを使用しました。

+0

'gets'はC++の一部ではないことに注意してください。 – NathanOliver

+0

C++の "if as rule"を参照してください。 coutとgets文は相互依存ではないため、順序は指定されません。 – doug

+5

@dougいいえ。これらは強く順番に実行されます。問題はまったく異なるものです。 –

答えて

1

を呼び出すのいずれかgets()coutのバッファが異なっています。 coutはバッファをフラッシュすることを強制しないので、実行はgets()関数に達するとバッファに残ります。

  • オプション1:使用cout << "str a:" << endl;バッファの内容をフラッシュ強制的に結果を強制的にあなたの期待と実行順序と一致します。改行が本当に必要ない場合は、flushを使用することもできます。

  • オプション2:同じバッファを使用しているか、お互いを認識しているリーダー/ライター機能を使用してください。たとえば、cin >> a;、またはcinからのgetlineの読み取りを使用して入力を読み取ります。

希望します。

+0

[リファレンスドキュメント](http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio)によると、これらの同期を強制することができます。また、これらの関数で使用される実際の_buffers_とは関係ありません。 –

8

ここではcout<<"str a:";より前に実行されていますか?

cout<<"str a:" << flush; 

はそれを修正する必要があります。

gets()が実際にcout<<"str a:";前に実行されていない、あなただけのflush()に画面上で印刷を強制的に出力ストリームを逃しました。

@Slava's answerで説明したように、ストリーム出力はバッファされ、通常std::cinと同期します。

出力は、バッファがいっぱいになるか、またはflush()機能を使用して強制されると、デバイスに実際に置かれます。 gets()以来

が(その間非推奨)C-機能である、自動同期は、あなたのmain()機能に

std::ios::sync_with_stdio(); 

一度呼び出さない限り、保証されません(documentationをご覧下さい)。


サイドノート:(a)の取得理由

代わりのgets()、C++ 14標準で推奨されていません、あなたはむしろここ

std::string a; // Much more convenient than char a[100]; 
std::getline(std::cin,a); 
2

を使用する必要があります。 coutの前に実行されています< < "str a:" ;?

これはありません。 coutの出力はバッファされていて、gets()を呼び出す前に出力をフラッシュしないと考えられます。 std::coutstd::cinを認識しており、そこから入力する前にフラッシュします。あなたがCを入力する呼び出しを使用する場合は、手動でstd::coutをフラッシュする必要がある、またはsync_with_stdio

関連する問題