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

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;
}
比如



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


简化一下程序


#include 
#include 
using namespace std;

int main()
{
    string str1;
    int x;cin>>x;
    //while(x--){
        getline(cin,str1);
        cout<


也是这样






但是如果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可以读取上前面的换行符(还在缓存区的换行)


解决方法用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,但只打无 Enter 键,输入语句并不开始执行,

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

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



谢谢


你可能感兴趣的:(------实验------,C++,算法的艺术)