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++的各类总结,这个链接是字符串的。

http://blog.csdn.net/wangfengwf/article/details/11496141