scanf函数读入整数后接着读字符串的换行符残余问题

Posted zxzmnh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scanf函数读入整数后接着读字符串的换行符残余问题相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<vector>
#include<map>
#include<sstream>
#include<algorithm>
using namespace std;
map<string ,vector<string> >title,keywords,author,publisher,publisher_year;
int n;
bool cmp(string a,string b){
    return a<b;
}
void res(map<string ,vector<string> > &m,string &str){
    if(m[str].size() == 0)cout<<"Not Found
";
    else{
        sort(m[str].begin(),m[str].end(),cmp);
        for(auto i:m[str]){
            printf("%s
",i.c_str());
        }
    }
}
int main()
{
    cin>>n;
//    getchar();
    for(int i=1;i<=n;i++){
        string id;
        getline(cin,id);
        string s;
        getline(cin,s);
        title[s].push_back(id);
    //    getchar();
        getline(cin,s);
        author[s].push_back(id);
    //    getchar();
        while(cin>>s){
            keywords[s].push_back(id);
            char c = getchar();
            if(c == 
)break;
        } 
    //    getchar();
        getline(cin,s);
        publisher[s].push_back(id);
    //    getchar();
        getline(cin,s);
        publisher_year[s].push_back(id);
//        getchar(); 
    }
    int m;
    cin>>m;
    string s;
    int tmp ; 
    for(int i=1;i<=m;i++){
        scanf("%d: ",&tmp);
        getline(cin,s);
        printf("%d: %s
",tmp,s.c_str()); 
        if(tmp == 1)res(title,s) ;
        else if(tmp == 2) res(author ,s);
        else if(tmp == 3) res(keywords,s);
        else if(tmp == 4) res(publisher,s);
        else if(tmp == 5) res(publisher_year,s);
    }
    return 0;
 } 

 scanf(),cin在读入一个数据时会把末尾的回车,换行留在缓冲区,如果后面紧接着读入字符串,需用space std;

map<string ,vector<string> >title,keywords,author,publisher,publisher_year;

int n;

bool cmp(string a,string b){

    return a<b;

}

void res(map<string ,vector<string> > &m,string &str){

    if(m[str].size() == 0)cout<<"Not Found ";

    else{

        sort(m[str].begin(),m[str].end(),cmp);

        for(auto i:m[str]){

            printf("%s ",i.c_str());

        }

    }

}

int main()

{

    cin>>n;

// getchar();

    for(int i=1;i<=n;i++){

        string id;

        getline(cin,id);

        string s;

        getline(cin,s);

        title[s].push_back(id);

    // getchar();

        getline(cin,s);

        author[s].push_back(id);

    // getchar();

        while(cin>>s){

            keywords[s].push_back(id);

            char c = getchar();

            if(c == ‘ ‘)break;

        } 

    // getchar();

        getline(cin,s);

        publisher[s].push_back(id);

    // getchar();

        getline(cin,s);

        publisher_year[s].push_back(id);

// getchar(); 

    }

    int m;

    cin>>m;

    string s;

    int tmp ; 

    for(int i=1;i<=m;i++){

        scanf("%d: ",&tmp);

        getline(cin,s);

        printf("%d: %s ",tmp,s.c_str()); 

        if(tmp == 1)res(title,s) ;

        else if(tmp == 2) res(author ,s);

        else if(tmp == 3) res(keywords,s);

        else if(tmp == 4) res(publisher,s);

        else if(tmp == 5) res(publisher_year,s);

    }

    return 0;

 } 

 scanf(),cin在读入一个数据时会把末尾的回车,换行留在缓冲区,如果后面紧接着读入字符串,需用先用getchar()函数吞掉那个回车符,再用getline函数多次读入字符串,getline()会将末尾换行符丢弃

以上是关于scanf函数读入整数后接着读字符串的换行符残余问题的主要内容,如果未能解决你的问题,请参考以下文章

#寒假集训[20200111-1]

c语言中怎样用scanf()读入带空格的字符串

scanf正则表达式部分总结

scanf("%[^ ]", str)正则用法,strchr()用法

scanf("%[^ ]", str)正则用法,strchr()用法

搞事情的程序语法基础