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