12

指定された時間、空白を受け入れる文字列変数でユーザーの入力を収集しようとしています。

通常cin >> strは空白を受け入れないため、 std::getline from <string> を使用します

これが私のコードです:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local); // This simply does not work. Just skipped without a reason.
        //............................
    }

    //............................
    return 0;
}

何か案が?

4

12 に答える 12

20

保存したものを出力すると、これが失敗する理由がわかりますlocal(ちなみに、これは貧弱な変数名です:P):

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local);
        std::cout << "> " << local << std::endl;
    }

    //............................
    return 0;
}

>番号を入力した直後に改行が表示されます。次に、残りの入力に移ります。

これはgetline、番号を入力したときに残った空の行が によって表示されるためです。(数字は読み取りますが、どうやら は削除されないため\n、空白行が残ります。)最初に残りの空白をすべて取り除く必要があります。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    cin >> ws; // stream out any whitespace
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local);
        std::cout << "> " << local << std::endl;
    }

    //............................
    return 0;
}

これは期待どおりに機能します。

トピックから外れて、おそらく手元のスニペットのためだけだったかもしれませんが、コードがない方が読みやすい傾向がありますusing namespace std;。名前空間の目的を無効にします。ただ、ここに投稿するためだけだったのではないかと思います。

于 2010-01-11T05:05:36.793 に答える
2

エンターを押していますか?行の終わりを待っているため、行を取得しない場合は何も返されません...

于 2010-01-11T04:35:04.427 に答える
2

私の推測では、n正しく読んでいないため、ゼロとして変換されています。0 は 0 未満ではないため、ループは実行されません。

少しインストルメンテーションを追加します。

int n;
cin >> n;
std::cerr << "n was read as: " << n << "\n"; // <- added instrumentation
for // ...
于 2010-01-11T04:35:54.337 に答える
1

重要な質問は、「入力がスキップされたと思わせる文字列をどうするか」です。または、より正確には、「なぜ入力がスキップされたと思いますか?」

デバッガーをステップ実行している場合、最適化を使用してコンパイルしましたか (命令の並べ替えが許可されています)。これはあなたの問題ではないと思いますが、可能性があります。

文字列が入力されている可能性が高いと思いますが、正しく処理されていません。たとえば、古い C 関数 (例: atoi()) に入力を渡したい場合は、C スタイルの文字列 ( ) を抽出する必要がありますlocal.c_str()

于 2010-01-11T07:57:54.713 に答える
1
  • n は入力から適切に初期化されていますか?
  • あなたは getline で何もしていないようです。これは、あなたの望むことですか?
  • getline は istream 参照を返します。地面に落としているという事実は重要ですか?
于 2010-01-11T04:35:24.437 に答える
1

どのコンパイラでこれを試しましたか? 私はVC2008で試してみましたが、うまくいきました。g++ (GCC) 3.4.2 で同じコードをコンパイルした場合。正常に動作しませんでした。以下は、両方のコンパイラで動作するバージョンです。私の環境には最新の g++ コンパイラがありません。

int n;
cin >> n;
string local;
getline(cin, local); // don't need this on VC2008. But need it on g++ 3.4.2. 
for (int i = 0; i < n; i++)
{
    getline(cin, local);
    cout << local;
}
于 2010-01-11T04:58:38.103 に答える