关于getline()的实验 getline()会读取留缓存区的换行符导致直接换行

ProLightsfx 2015-11-30 216 11/30

getline()会读取留缓存区的换行符导致直接换行,以前也没有注意吧,最近才注意到。

 

#include 
#include 
#include 
#include 
#include 
using namespace std;
//把一个字符串中的数字子序列找出来并转换成十进制整数输出
int main()
{
    int T;
    string str;
    scanf("%d",&T);
    while(T--){
        getline(cin,str);//cin>>str;
        for(auto &i : str )
            if(!isdigit(i)) i=' ';
        stringstream line(str);
        unsigned x,cot=0;
        while(line>>x) {
            if(cot==0) printf("%d",x);
            else if(cot==1)printf(" %d ",x);
            else printf("%d ",x);
            cot++;
        }
        if(T) printf("n");
    }
    return 0;
}

比如

关于getline()的实验 getline()会读取留缓存区的换行符导致直接换行

 

本来可以输入2组数据的,却只能输入一组

简化一下程序

#include 
#include 
using namespace std;

int main()
{
    string str1;
    int x;cin>>x;
    //while(x--){
        getline(cin,str1);
        cout<<str1<<"n";
   // }
    return 0;
}

也是这样

关于getline()的实验 getline()会读取留缓存区的换行符导致直接换行

 

但是如果getline()前面没有输入操作

 

#include 
#include 
#include 
#include 
#include 
using namespace std;
 
int main()
{
    int T=2;
    string str;
    //scanf("%d",&T);printf("n");
    while(T--){
        getline(cin,str);//cin>>str;
        for(auto &i : str )
            if(!isdigit(i)) i=' ';
        stringstream line(str);
        unsigned x,cot=0;
        while(line>>x) {
            if(cot==0) printf("%d",x);
            else if(cot==1)printf(" %d ",x);
            else printf("%d ",x);
            cot++;
        }
    //getchar();
        if(T) printf("n");
    }
    return 0;
}

 

关于getline()的实验 getline()会读取留缓存区的换行符导致直接换行

 

则可以

 

因此笔者觉得,getline可以读取上前面的换行符(还在缓存区的换行)

 

解决方法用getchar();吸掉那个换行。

 

#include 
#include 
#include 
#include 
#include 
using namespace std;

int main()
{
    int T=2;
    string str;
    scanf("%d",&T);getchar();
    while(T--){
        getline(cin,str);//cin>>str;
        for(auto &i : str )
            if(!isdigit(i)) i=' ';
        stringstream line(str);
        unsigned x,cot=0;
        while(line>>x) {
            if(cot==0) printf("%d",x);
            else if(cot==1)printf(" %d ",x);
            else printf("%d ",x);
            cot++;
        }
    //getchar();
        if(T) printf("n");
    }
    return 0;
}

 

然后搜索了一下解释:

 

C执行输入语句,要等到用户输入数据并打入Enter键后才开始。

用户打入的数据和Enter键都在输入缓冲区中。

输入语句是从缓冲区中依次取数。

下一个输入语句,先到缓冲区中找没读完的数,缓冲区若有数,

就取来用,若没有,就等待,一直等到用户打入Enter键,再开始取数。

由于getchar();只读一个字符,

例如:

char x;
printf("Enter 1 please: ");
x=getchar();
putchar(x);
x=getchar();  // 吸收Enter
printf("n");
printf("Enter 2 please: ");
x=getchar();
putchar(x);

叫你打1,但只打1无Enter键,输入语句并不开始执行,

你若打了1,又打了Enter键,getchar();只用去1,余下的 Enter 键,还在缓冲区,如果不用吸收Enter那句,printf("Enter 2 please: ");后面的getchar();就不等你输入,就从缓冲区取Enter,程序就结束了。

From http://zhidao.baidu.com/link?url=4XRMlbBZ9SuWM1svFIUGLPN-MkuS02ipom17xArlM8FJIW1SDGcaJKnnhGJTlL7284CaAj2RiflYdYW2Y2j1E_

 

 


非特殊说明,本站所有文章均为博主原创,未经许可不得转载。

https://www.prolightsfxjh.com/

Thank you!

                                                                                                                                             ------from ProLightsfx

- THE END -

ProLightsfx

11月16日09:01

最后修改:2024年11月16日
1

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论