- /****************************
- * 程序描述:简单单词数统计
- * 运行环境: Linux/Windows
- * 开发环境: gedit,gcc
- **************************/
- #include <stdio.h>
- #include <string.h>
- struct _str_type
- {
- char str[20];
- };
- struct _word_info
- {
- char str_word[20];
- int num;
- };
- typedef struct _word_info word_info_t;
- typedef struct _str_type str_type_t;
- str_type_t g_div_str[100]; //用来存放拆分后的结果
- word_info_t g_word_info[100]; //用于记录单词出现次数
- int g_word_info_num = 0;//word_info元素个数
- int word_info_index = 0;
- /*********************************************
- 函数名:find_word_info
- 函数功能:在数组word_info中查找单词的统计信息
- 输入参数: 被查找的单词
- 输出参数: 无
- 返回值: 查找成功,返回单词统计信息对应数组元素下标
- 查找失败 ,返回 -1
- 备注: 使用了全局变量 g_word_info
- ************************************************/
- int find_word_info(char *str_word)
- {
- int i = 0;
- for(i = 0; i < g_word_info_num; i++)
- {
- if(strcmp(str_word, g_word_info[i].str_word) == 0)
- {
- //查找成功
- return i;
- }
- }
- return -1;
- }
- /************************************************
- 函数名: static_word_info
- 功能: 统计每个单词的出现次数
- 输入参数: 拆分后的单词列表 str_type_t *pstr_arr
- int word_num 总的单词数
- 输出参数:统计后的结果 word_info_t *pword_info
- 返回: 结构体元素的个数
- **************************************************/
- int static_word_info(str_type_t *pstr_arr, int word_num,
- word_info_t *pword_info)
- {
- int i = 0;
- char str_temp[30];
- int word_index = 0;
- for(i = 0; i < word_num; i++)
- {
- memset((unsigned char *)str_temp, 0, 30);
- strcpy(str_temp, pstr_arr[i].str);
- word_index = find_word_info(str_temp);
- if(word_index < 0)
- {
- // 表示没有找到统计信息,该单词第一次出现
- //增加该单词统计信息到 g_word_info
- strcpy(pword_info[word_info_index].str_word,
- str_temp);
- pword_info[word_info_index].num = 1;
- word_info_index++;
- g_word_info_num++;
- }
- else
- {
- //该单词再次出现
- pword_info[word_index].num++;
- }
- }
- return g_word_info_num;
- }
- /**************************************************
- 函数名:divide_str
- 功能: 将一个字符串拆分成多个单词,保存在字符串数组
- 输入参数: char *data 待拆分的字符串
- 输出参数: str_type_t *pstr_arr 用于保存拆分后的结果
- 返回值:成功 返回 0,失败返回 -1
- ****************************************************/
- int divide_str(char *data, str_type_t *pstr_arr)
- {
- char *a = data;
- int word_num = 0;
- int len;
- int i;
- int j;
- len = strlen(data) + 1;
- for(i = 0; i < len;i = i+1)
- {
- if(data[i] != ' ')
- {
- for(j = i;j < len;j++)
- {
- if((data[j] == ' ') || (data[j] == '\\0'))
- {
- //找到了一个单词,起始位置i,end pos j-1
- strncpy(pstr_arr[word_num].str,a+i,j-i);
- word_num++;
- i = j;
- break;
- }
- }
- }
- }
- return word_num;
- }
- int main(int argc, char *argv[])
- {
- char a[100];
- int word_num = 0;
- int i = 0;
- int word_info_num = 0;
- memset((unsigned char *)a,0,100);
- memset((unsigned char *)&g_div_str, 0 ,
- 100*sizeof(str_type_t));
- gets(a);
- word_num = divide_str(a, g_div_str);
- //输出拆分后的单词
- word_info_num = static_word_info(g_div_str,
- word_num,g_word_info);
- for(i = 0; i < word_info_num; i++)
- {
- printf("%s : %d\\n", g_word_info[i].str_word,
- g_word_info[i].num);
- }
- return 0;
- }
- //该片段来自于http://www.codesnippet.cn/detail/1304201512209.html
来源: http://www.codesnippet.cn/detail/1304201512209.html