getline()是否不提取定界符?

时间:2018-11-09 04:49:41

标签: c++ getline

所以我先输入一些整数,然后再输入一些句子。

此代码可以正常工作:

#include<bits/stdc++.h>
using namespace std;
main(){
    int c,b,n,i;string s;
    cin>>n>>b>>c;
    for(i=0;i<n;i++){
        cin>>ws;
        getline(cin,s,'\n');
        cout<<s; 
     }
    }

示例:

3 3 3
This is weird
This is weirdDefinitely makes
Definitely makesNo sense
No sense

但是,当我尝试在forloop中省略cin >> ws时,它无法正常工作,例如此代码段,

#include<bits/stdc++.h>
using namespace std;
main(){
    int c,b,n,i;string s;
    cin>>n>>b>>c;
    for(i=0;i<n;i++){
            getline(cin,s,'\n');
            cout<<s;
    }
}

示例:

3 3 3
This is weird
This is weirdDefinitely makes
Definitely makes

..并在那里终止而不是全部输入三个。 这是为什么? cin >> ws从输入中提取所有空格,但是getline()也不这样做吗?那么当我在forloop中省略cin >> ws时,为什么它不能正常工作?

4 个答案:

答案 0 :(得分:2)

std::getline()提取字符,直到提取第一个定界符(默认为'\ n')。定界符未存储在结果中,但已将其提取。它不会提取一般或多个定界符的空格。

顺便说一句:总是检查输入是否在尝试读取值后 有效。

在打印的示例中,问题在于格式化输入后(即使用>>运算符)之后,没有提取空格。即,对std::getline()的第一次调用提取以初始换行符结尾的空字符串。在格式化和未格式化的I / O之间切换时,通常有必要提取尾随空白。也就是说,您想要类似的代码

if (cin>>n>>b>>c >> std::ws) {
    for(i=0;i<n;i++){
        if (getline(cin,s,'\n')) {
            cout << "i=" << i << ":'" << s << "'\n";
        }
    }
}

我不建议输入操作而不添加成功检查。更改输出以使其更容易看到正在发生的事情:在有/没有此特定std::endl的情况下尝试代码,以查看正在发生的情况。

答案 1 :(得分:0)

getline()的默认定界符为'\ n',因此无需在getline调用中包含该定界符,尽管它不应更改功能。

例如参见Same as getline(input, str, input.widen('\n')), that is, the default delimiter is the endline character.

如@DietmarKühl所述,从整数输入到getline()输入的格式更改将在整数后留一些空格(endl)。

您可以更改getline()调用以将分隔符消除为

getline(cin,s);

这将导致getline()使用'\ n'作为默认分隔符。

我修改了'n'变量以计数并删除了其他整数,以使代码更易于阅读:

#include <iostream>

int main()
{
    int i;  // index
    int count;  // number of strings to accept
    std::string str;

    std::cout << "Input the number of strings you would like me to process: " << std::endl;
    std::cin >> count;

    if (std::cin >> count >> std::ws) {
        for (i = 0; i < count; i++) {
            if (getline(std::cin, str)) {
                std::cout << "i=" << i << ":'" << str << "'\n";
            }
        }
    }
}

答案 2 :(得分:0)

Cin不会提取所有空格,它只会得到第一个单词,直到第一个空格。就像有一条带有空格定界符的getline(不完全但很接近)。

Getline使用整行,并具有如上所述的默认'\ n'分隔符。

例如:

string a = "Stack Overflow is awesome";

可以给你Stack和getline可以给你那一行的一切

答案 3 :(得分:0)

使用cin >>时,输入后不会删除任何空格。这意味着终止前三个输入的换行符仍在缓冲区中,等待被第一个getline读取。由于换行符之前没有任何内容,因此第一个getline传递了一个空字符串。您的输出应该包含换行符,这样您就可以看到空行,然后才有意义。

您最初发布的代码在cin >> ws循环之前显示了for,这可以消除此问题。