C++下面关于字符串数组的一些操作
今天在写一个搜索引擎的分词系统,是很简单的那种,但是居然费了我一天的时间还没完成,晚上估计还得弄一会了,但是在这个过程中,遇到了集中关于字符串数组的操作,值得和大家分享一下。
首先是关于统计字符串数组元素的个数:
字符串数组不同于整型数组,每一个字符串所占的空间是不一样的,不能用sizeof简单的计算出来。下面是示例代码:
#include <iostream> #include <string> using namespace std; int main() { string str[] = {"abfafawfefw","defg","32121","Miss","11111"}; cout << sizeof(str) / sizeof(str[0]); return 0; }
字符串数组存取方式采用了对齐原则,占用空间少的向占用空间多的靠齐,首先使用sizeof(str)首先获得所用的所用字节数,使用sizeof(str[0])再计算数组中一个元素平均占用的字节数。然后除一下,就是元素个数,但是注意,被除的那个元素应该是所占空间最大的那个。
然后是关于统计字符串数组各个元素出现的次数:
这个是我用在统计分词后得到的词组各自的频次的,但是不知道出了什么问题,一直实现不了,虽然我知道这个确实是很简单的一个问题。
我通过大百度找到了一种统计次数的方法,他是统计整型数组的,但是感觉很不错,但是我暂时还没有验证,先贴出来吧:
#include<stdio.h> #include<stdlib.h> main() { int a[100],b[100],c[100]={0},i,j; //a数组放随机数 //b数组放是否被统计的标志,1未统计,0已统计 //c数组放对应a数组中随机数出现的次数 for(i=0;i<100;i++) { a[i]=rand()()%21;//产生0~20的随机数 b[i]=1;//未统计 printf("%5d",a[i]); //打印a数组的值 if((i+1)%10==0) //一行打印10个数 printf("\n"); } printf("\n"); for(i=0;i<100;i++) { if(b[i]) //若a[i]未被统计 { c[i]++; //次数加1 for(j=i+1;j<100;j++)//从下一个开始向后查找 if(a[j]==a[i]) //若相等 { c[i]++; //则次数增1 b[j]=0; //改为已统计 } } } for(i=0,j=1;i<100;i++) { if(c[i]) //若某随机数出现了,则打印其值和出现次数 printf("%3d:%5d 出现 %3d次\n",j++,a[i],c[i]); } }
他用了一个统计标志,这个很适合我现在的这个问题,也希望能对大家有用吧,谢谢了。
下面是CSDN上一个很不错的关于C++的各类总结,这个链接是字符串的。