题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1756
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
题意:题目给出每行按空格分割的文本数据,要求统计出文章中所有的单词并按字典序输出,不区分大小写。
思路:首先读入数据,拆分成字符串,然后将大写字母转化为小写字母,并对多余的标点符号进行处理。此后将每个单词置入set中,set按字典序排列,输出即可。看上去很简单的一道题,但是有一些不容易注意到的坑。
注意:
1.本文中进行判断的时候,很容易将anscii码与‘A‘与‘z‘比较,但是,基于我们都知道的一个事实是‘A‘和‘a‘相差32,也就是说之间仍然有字符,91-96分别是[,\,],^,\,` 也就是说不能简单按照‘A‘与‘z‘进行判断。当然可以使用isalpha()判断。
2.很自然的会想到标点符号可能会在字符首末,然而存在这样的情况"Andy‘s apple",在这种情况下,输出应为"andy s apple",所以,应该首先对字符串进行处理,即将不是字母的符号替换为‘ ‘(空格),然后再进行分割。
代码:
#include<cstdio> #include<string> #include<iostream> #include<set> #include<sstream> #include <cstring> using namespace std; string s1; string cur; set<string> s; int main(void){ while(getline(cin,s1)){ for(int i=0;i<s1.length();i++){ if(s1[i]<‘A‘||s1[i]>‘z‘||(s1[i]>‘Z‘&&s1[i]<‘a‘)){ s1[i]=‘ ‘; } } stringstream input1(s1); while(input1>>cur){ for(int i=0;i<cur.length();i++){ if(cur[i]>=‘A‘&&cur[i]<=‘Z‘){ cur[i]=cur[i]+32; } } if(cur.length()>0) s.insert(cur); } } set<string>::iterator it; for(it=s.begin();it!=s.end();it++) { cout<<*it<<‘\n‘; } return 0; }