C++ getline()是否不提取分隔符?

C++ getline()是否不提取分隔符?,c++,getline,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;

我输入了一些整数,然后输入了一些句子

此代码工作正常:

#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; 
     }
    }
然而,当我试图在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;
    }
}
..并在那里终止,而不是接受所有三个输入。 为什么呢?cin>>ws从输入中提取所有空白,但getline()不是也这样做吗?那么,当我在forloop中省略cin>>ws时,为什么它不能正常工作呢

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";
        }
    }
}
if(cin>>n>>b>>c>>std::ws){
对于(i=0;i
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";
        }
    }
}
if(cin>>n>>b>>c>>std::ws){

对于(i=0;igetline()的默认分隔符是“\n”,因此不需要在getline调用中包含该分隔符,但它不应更改功能

例如,见

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

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

getline(cin,s);

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

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

#包括
int main()
{
int i;//索引
int count;//要接受的字符串数
std::字符串str;
std::cout计数;
如果(std::cin>>计数>>std::ws){
对于(i=0;istd::coutgetline()的默认分隔符是“\n”,因此无需在getline调用中包含该分隔符,但它不应更改功能

例如,见

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

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

getline(cin,s);

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

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

#包括
int main()
{
int i;//索引
int count;//要接受的字符串数
std::字符串str;
std::cout计数;
如果(std::cin>>计数>>std::ws){
对于(i=0;iCin不会提取所有的空格,它只获取第一个单词直到第一个空格。这就像有一个带有空格分隔符的getline(不完全是但接近)

Getline接受整行,并具有如上所述的默认“\n”分隔符

例:


可以为您提供堆栈,getline将为您提供该行的所有内容

Cin不提取所有空格,它只获取第一个单词,直到第一个空格。这就像有一个带有空格分隔符的getline(不完全是,但接近)

Getline接受整行,并具有如上所述的默认“\n”分隔符

例:


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


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

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


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

这实际上是不正确的:
getline()
有两个停止的原因:找到分隔符或找到流的结尾。它不会停止
if (cin>>n>>b>>c >> std::ws) {
    for(i=0;i<n;i++){
        if (getline(cin,s,'\n')) {
            cout << "i=" << i << ":'" << s << "'\n";
        }
    }
}
string a = "Stack Overflow is awesome";