int n,i;
cin >> n;
string str[n];
for(i=0;i<n;i++)
{
getline(cin,str[i]);
}
この時なぜか1回目つまりiが0の時のループの時getline関数が無視されて
n = 3の時なぜか2回しか実行されません
なぜでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
iが0の時のループの時getline関数が無視されて
厳密には無視されたのではなく、最初のgetlineでは空文字列(文字数0の文字列)が勝手に入力されて、2回目から文字列を読み取るという状況です。
cin
の>>
では、必要なものを読み取ったら、それ以上の読み取りはしません。
どういうことかというと、最初に数値を入力したとき、改行コードも入力されます。cin >> n
では、数字は読み取りますが、改行コードは残されます。そして、ループに入って最初のgetline
ではいきなり改行コードが現れるので、空行(改行のみの行)が入力されたと思って空文字列が設定されます。
読み取り方法の違うものを混在させると問題が起きやすいので、cin
を使いたいならcin
だけ、getline
を使いたいならgetline
だけにした方が良いと思います。
このケースなら、私なら最初の数字もgetline
で文字列として読み取りstoi
で数値に変換、という風にします。
投稿2018/01/29 02:53
総合スコア5944
0
一応、改行文字まで読み飛ばすという方法もありますよ。
cpp
1std::cin >> n; 2std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 3std::getline(std::cin, str);
ただ注意すべき点があります。この方法を用いると、そもそもバッファに改行が残っていない場合 (=始めての入力や、前の入力で改行まで読み取っている場合など。たとえば、上のサンプルの一行目をコメントアウトした場合など) に最初の入力が無視されてしまうことです。 (「改行文字が出てくるまでの入力」には「これから入力される文字」を含みますので、最初に改行を入力するまでの新たな入力も捨てられてしまうのです。) そういう意味でも、 catsforepaw さんのおっしゃる通り、統一した方がミスも少なくなると思います。
ところで、 cin の便利な点として、複数の数字でも空白区切りで簡単に取れるという利便性があります。こういう利便性が欲しい場合は、getline() した string を istringstream につっこむと、cin と同様に扱うことができます。C言語で言うところの fgets() + sscanf() の組み合わせになります。
たとえば空白区切りで3つの数字 a, b, c を受け取りたい場合:
cpp
1std::getline(std::cin, str); 2std::istringstream is{str}; 3is >> a >> b >> c;
あくまで入力は改行まで受け取っておいて、その後加工するという方針なので、先の問題は起こりません。
投稿2018/01/29 08:23
総合スコア429
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
読み込みバッファーの読み取り位置の競合が起きているからです。
詳しい理由と解決策はこちら。
C++のstd::cinを思い通りに動作させる。
投稿2018/01/29 01:22
総合スコア28669
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
理由までは調べてませんが、cinとgetlineを組み合わせると質問のような現象が起きますね。
試しにgetlineを使わずにcinを使うと問題なく動きます。
c
1 for(i = 0; i < n; i++) 2 { 3// getline(cin,str[i]); 4 cin >> str[i]; 5 }
併用する場合、cinのあとにダミーでgetlineを入れておくと問題なく動きます。
c
1 int n,i; 2 cin >> n; 3 string str[n]; 4 string t; // 追加 5 getline(cin, t); // 追加
改行コード周りの処理が異なるのでしょうかね。
投稿2018/01/29 01:17
総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/29 15:37