提取单词及个数用数组和函数

【问题描述】编写一个程序,读入几行文本,并打印一个表格。此表格按照单词在文本
长度不超过20个字符每行文本字符数不超过80,输入文本中的单词个数不超过1000个。
(2)编写一个函数readWords()从读入的几行文本中抽取每个单词,将其存储在二维数组
(1)可定义一个二维字符数组char words[1001][21]用于按照输入文本中单词出现的顺
要求:
中出现的顺序,显示每个不同单词(不区分大小写)在文本中的出现次数。约定每个单词的
序依次存储每个单词。
words中。(3)编写一个函数countAndPrintWords(),依次计算words数组中每个单词出现的次数,
并按照每行显示五个单词的格式,依次打印出每个单词出现的次数。
(4)在main函数中,调用上述定义的函数。

代码如下:

#include <iostream>
using namespace std;
//判断ch是否是字母
int isZm(char ch)
{
    if( (ch >='a' &&ch <='z') || (ch>='A' && ch <='Z') || (ch == '\'') )
        return 1;
    else
        return 0;
}
char tolower(char ch)
{
    if(ch>='A' && ch <='Z')
        return ch + 32;
    else
        return ch;
}

void readWords(char words[][21],int &nmb)
{
    int i,n;
    char buf[100];
    nmb = 0; //单词数量
    cout << "请输入读取的行数:" ;
    cin >> n;
    cin.get();
    cout << "请输入" << n << "行字符:"<<endl;
    for (i=0;i<n;i++)
    {
        cin.getline(buf,80);
        int j = 0;
        int k = 0;
        while(buf[j] && (!isZm(buf[j])) ) j++;
        while(buf[j])
        {
            if(isZm(buf[j]))
            {
                words[nmb][k] = tolower(buf[j]);
                k++;
            }else //假设单词中只有英文字母,没有特殊符号(如.')
            {
                if(isZm(buf[j-1]))
                {
                    words[nmb][k] = 0;
                    nmb++;
                    k = 0;
                }
            }
            j++;
        }
        if(isZm(buf[j-1]))
        {
            words[nmb][k] = 0;
            nmb++;
            k=0;
        }
    }
}
//统计单词数量
void countAndPrintWords(char words[][21],int nmb)
{
    int i,j;
    int cnt[1001];
    for(i=0;i<nmb;i++)
        cnt[i] = 0;
    cnt[0] = 1;
    for (i = 1;i<nmb;i++)
    {
        for (j=0;j<i;j++)
        {
            if( strcmp(words[i],words[j]) == 0 )
            {
                cnt[j]++;
                break;
            }
        }
        if(j == i)
            cnt[i] = 1;
    }
    //显示
    int kt = 0;
    for (i=0;i<nmb;i++)
    {
        if (cnt[i] != 0)
        {
            cout << words[i] << " " << cnt[i] << " ";
            kt++;
            if(kt%5==0)
                cout << endl;
        }
    }
}
int main()
{
    char words[1001][21];
    int nmb;
    readWords(words,nmb);
    countAndPrintWords(words,nmb);
    return 0;
}

单词分隔符只有空格么,还是有其它字符,最好限定一下。
gets函数逐行读入,然后根据空格拆分出单词,将单词记录到二维数组。同时定义一个与单词二维数组一样长的整型数据,用来记录每个单词的出现频率。
当拆分出一个新的单词时,到单词数组进行检索,如果已经存在,则对应的整型数组值加1,否则单词数组增加新的单词,对应的整型数组值为1
最后打印单词数组及对应整型数组中的出现次数就行了