2012-01-24 8 views
-4

私は、入力した後にのみプログラムがstdinから読み込むテキストブロックをコンソールに入力させようとしています。 2回連続してヒットしたか、または別の方法で、入力が空白の行に当たったと言いました。しかし、私はstdinから基本的に読むことを続けたいと思う。その後、フラッシュして再起動します。ユーザー入力のC/C++入力した後にstdinから読み込む方法行内に2回、または改行2回後にヒットする

例:

Hello(\n) 
World(\n) 
(\n) 
(Read Now) 

私は、この動作を特定可能な入力機能を見つけることができませんでした。

また、私は一文字検索機能を使用していくつかの方法を試しましたが、正しく動作させることができませんでした。

誰かがこれを優雅に行う方法を知っていますか?実装

回答:

char word[100]; 
int i = 0; 
while ((word[i++] = getchar())!='\n' || (word[i++]=getchar())!='\n'); 
printf("%s",word); 

明らかにオーバーフローがこれを使用する前に対処する必要がありますバッファー。ほんの一例。

+3

空行を読むときに1行ずつ読み込み、フラグを設定します。 –

+3

「フラッシュして再起動する」とはどういう意味ですか?あなたのプログラムのセマンティクスは本当に悪いと指定しました。 –

答えて

2

基本的には、シーケンス\n\nまで入力を無視します。

while (getchar()!='\n' || getchar()!='\n'); 
//read the input now 
+0

美しく、シンプルでシンプルです。私は思いついた長い解決策よりも優れた方法があると思った。 – pandaEater

2

空白行を読み、無視するまですべてを無視します。

// Untested code 
std::string s; 
// Ignore first block 
while(std::getline(std::cin, s) && !s.empty()) { 
    /* nothing */ 
    ; 
} 
// Don't ignore the second block 
while(std::getline(std::cin, s)) { 
    std::cout << "You typed: " << s << "\n"; 
} 
0

あなたは彼らが来るが、それは2つの改行を見ているまでのブロックは文字を転送するようラインを読み込み、フィルタリングストリームバッファを作成することができます。そうすれば、何かがリセットされるまでこれが期待されることになります。

class blockbuf: public std::streambuf { 
public: 
    blockbuf(std::streambuf* sbuf): sbuf_(sbuf), blocked_(false) {} 
    int underflow() { 
     std::istream in(this->blocked_? 0: this->sbuf); 
     for (std::string line; std::getline(in, line) && !line.empty();) { 
      this->buffer_ += line + "\n"; 
     } 
     if (this->in_) { 
      this->buffer_ += "\n"; 
     } 
     this->setg(this->buffer_.c_str(), this->buffer_.c_str(), 
        this->buffer_.c_str() + this->buffer_.size()); 
     this->blocked_ = true; 
     return this->gptr() == this->egptr() 
      ? traits_type::eof() 
      : traits_type::to_int_type(*this->gptr()); 
    } 
    void unblock() { this->blocked_ = false; } 

private: 
    std::streambuf* sbuf_; 
    bool   blocked_; 
    std::string  buffer_; 
}; 

あなたはこのような何か(あなたがstd::cinを経由して、それを使用したい場合は、std::cinのストリームバッファを置き換えるためにstd::cin.rdbuf()を使用することができます)このストリームバッファを使用します:

blockbuf b(std::cin.rdbuf()); 
std::istream in(&b); 
for (std::string block; std::getline(in, block, 0); b.unblock(), in.clear()) { 
    processAllLinesUpToEmptyLine(block); 
} 
コードは次のようになります

明らかに、このゲームのプレイ方法には多くのバリエーションがあります。

関連する問題