• 统计字符串中的单词数目


            统计字符串中单词的数目,更复杂的话从一个文本中读出字符串并生成单词数目统计结果。
            第一个问题:这个问题的解决方案是,字符串之所以可以成为单词就是因为有空格符的出现,那么对于字符串中单词的数目来说,只需要统计其中空格符出现的次数就可以了~~~
            第二个问题,从文本中读出字符串并统计每一个单词的统计结果,那么久需要借助于字典map了,每一个单词使用了一个位置 ,如果是已经出现的单词,那么就给相应的单词数量加一,如果没有出现在字符串中,那么就添加该单词。

            对于一串字符串来说,如果需要对于其中的单词进行统计,就要首先搞清楚字符串的特点是什么,其中空格是作为分隔符的,如果可以使用正则表达式,那么只需要一层一层的分解。但是C++中没有正则表达式,就需要对于字符串进行一次次的判断一直到最后的结果,其实主要就是对于字符串中的制表符/t换行符/n忽略掉。一层一层的进行计算,最后得出最后的结果~~~


        在这里遇到一个问题,就是C++中指针为null和""和什么也不做的区别~

    1. string a;
    2. if(!a.empty())
    3. cout<<"string a";
    4. string b = "";
    5. if(!b.empty())
    6. cout<<"string ''";
    7. if(a == b)
    8. cout<<"string '' a"<<endl;
    首先说明,C++中的string a;string b = "";是一样的效果,他们有地址,但是结果为空,但是如果声明a = NULL 那么a连地址都没有,就更加不能使用empty函数进行判断了。如果empty返回为true,说明a不为空。

    下面的是该算法的代码:
    1. #include <iostream>
    2. #include <map>
    3. #include <string>
    4. #include <fstream>
    5. using namespace std;
    6. int main(int argc, char const *argv[])
    7. {
    8. ifstream fin("wordtotol.txt", std::ios::in);
    9. char line[1024]={0};
    10. string str = "";
    11. while(fin.getline(line, sizeof(line)))
    12. str += line;
    13. fin.clear();
    14. fin.close();
    15. map<string,int> wordmap;
    16. map<string,int>::iterator mapiter;
    17. string unit;
    18. string::iterator rIt = str.begin();
    19. while (rIt != str.end())
    20. {
    21. if(*rIt>='A' && *rIt<='Z')
    22. *rIt += 32;
    23. if ( 'a'<=*rIt && *rIt<= 'z' )
    24. {
    25. unit+=*rIt;
    26. rIt++;
    27. continue;
    28. }
    29. else{
    30. if ( (mapiter = wordmap.find(unit) )!= wordmap.end())
    31. {
    32. mapiter->second++;
    33. }else if(!unit.empty())
    34. {
    35. wordmap.insert(make_pair(unit,1));
    36. }
    37. rIt++;
    38. }
    39. unit.clear();
    40. }
    41. int n=0;
    42. for (mapiter = wordmap.begin(); mapiter != wordmap.end(); ++mapiter)
    43. {
    44. cout<<mapiter->first<<" "<<mapiter->second<<endl;
    45. n+=mapiter->second;
    46. }
    47. cout<<"单词数目:"<<wordmap.size()<<endl<<"所有单词数目:"<<n<<endl;
    48. return 0;
    49. }
    将文件读入后存入str字符串中,然后依次循环,当前字符字母为大写的时候,将大写转为小写。如果是字母那么一直循环,并添加到unit单词中,遇到不是字符的,首先将上面的单词find一下,找到则加一,没有找到则说明是一个新单词,当该单词插入到map中。最后对map进行一次循环得到结果。
    总结:fin.getline(line, sizeof(line))是读取文件的操作,对于读取的文件首先需要有缓冲区,将每一行读入缓冲区之后,再对缓冲区的line进行操作~~~





  • 相关阅读:
    Linux下Mysql的安装步骤
    分布式集群Session原理及实现共享
    MySQL数据库表分区功能详解
    PHP面向对象程序设计之接口(interface)
    PHP面向对象程序设计之抽象类和抽象方法
    MySQL优化技巧
    MySQL性能优化之max_connections参数
    PHP环境下Memcache的使用方法
    PHP之Trait详解
    如何选择合适的MySQL数据类型
  • 原文地址:https://www.cnblogs.com/clifff/p/5039581.html
Copyright © 2020-2023  润新知