ecnuoj3124:单词表

统计字符串中的单词,删除重复,并按字典序输出

使用set,遍历字符串,定位出单词的位置,使用substr截取单词,insert到set中,输出set即可

注意1

使用getline(cin, str)的时候,如果前面有输入数字,需要添加getchar()吸收缓冲区中的换行符

注意2

当输入只有一个单词的时候

1
word

由于字符串结尾没有分隔符,因此最后一个单词没有能够进行insert

解决方法,输入字符串后,先在末尾添加一个句号,在进行处理

str.push_back('.');

完整代码如下

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <set>
using namespace std;

#define IN 1    //标记,表示当前在一个单词内
#define OUT 0   //标记,表示当前不在一个单词内

//判断是否为分隔符
bool isSplit(char ch){
    if(ch == ' ' || ch == ',' || ch == '.' || ch == '!' || ch == '?'){
        return true;
    }
    else{
        return false;
    }
}

int main(){
    int T;
    scanf("%d", &T);
    getchar();      //注意此处吸收输入T后缓冲区中残留的换行符
    for (int k = 0; k < T; ++k) {
        string str;
        int state = OUT;
        int st;
        set<string> s;
        getline(cin, str);
        str.push_back('.');     //在末尾多追加一个句号
        for (int i = 0; str[i]; ++i) {
            if (!isSplit(str[i]) && state == OUT){
                state = IN;
                st = i;
            }
            else if(isSplit(str[i]) && state == IN){
                state = OUT;
                string word = str.substr(st, i - st);
                s.insert(word);
            }
        }
        printf("case #%d:\n", k);
        for(auto it = s.begin(); it != s.end(); ++it){
            if(it == s.begin()){
                cout << *it;
            }
            else{
                cout << " " << *it;
            }
        }
        printf("\n");
    }
    return 0;
}
posted @ 2022-02-15 18:54  dctwan  阅读(45)  评论(0编辑  收藏  举报