题目就不描述了,直接转至牛客可查看:
上代码:
//使用了map容器以及用cin.get()逐个读入字符
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
string s="";
char ch;
map<string,int> m;
while(cin.get(ch)) //cin.get()逐个读入字符
{
//说明s字符串中已经存下一个单词,将其扔到map中,将s赋空,以便存入下一个单词
if(ch==',' || ch=='.' || ch=='\n' || ch==' ')
{
if(s!="") //将s中的内容,(一个单词),赋给map
{
m[s]++;
s = "";
}
}
else
//此单词还没有读取完毕,将读取到的字符都转化为小写,暂时存入字符串s中
{
ch=tolower(ch);
s += ch;
}
}
//map自动将键值对排序,省去了很多麻烦,直接从头到尾遍历输出就好了
map<string,int>::iterator it;
for(it=m.begin(); it!=m.end(); it++)
cout<<it->first<<":"<<it->second<<endl;
return 0;
}
cin不能读入空格回车制表符,本题也可以使用,但那就不是逐个读取字符,而是另一种解题思路了,肯定能做,但不如上面这个简单。
cin.get()能够读取空格回车制表符,遇EOF(Ctrl+Z)结束读取,能够实现逐个读取字符,读取后手动将单词分割。
scanf同cin一样,也不能读取空格回车制表符
getline()可实现成行读取,也就是可读取空格。
读取方式cin,cin.get(),gets(),getline等等等等对处理字符串的题目很重要,有空再补充吧。
下面是一些关于读取方式的文章,觉得还不错。