Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
Sample Output
4
/*
有多组数据,每组一行,每组就是一篇小文章。
每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
you are my friend
#
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char s[1000],w[100][100];
int i=0,j=0,k=0;
int cnt1=0;
int flag=0,re=0;
int len=0;
while(gets(s))//有多组数据
{
if(s[0]=='#')//这个#是单独进行输出的,故每次判断是否已经结束,结束就不再进行循环
break;
len=strlen(s);//得出该字符串的长度
re=0;//对每个句子进行计数时,要重新对输出计数和数组的字母进行计数
k=0;
j=0;
for(i=0;i<len;)
{
if(s[i]==' ')//对于句子中的空格,直接进行跳过
i++;
else
{
while(s[i]!=' '&&s[i]!='\0')//对于不是空格和换行的符号进行分离,得到每一个单词
{
w[k][j]=s[i];
j++;
i++;
}
k++;
j=0;
}
}
cnt1=k;
for(i=0;i<cnt1;i++)//进行单词的比较
{
flag=0;
for(j=0;j<i;j++)//比较单词就可以得到结果
{
if(strcmp(w[i],w[j])==0)//相等返回0,若等于0则进行flag的增加
flag++;
}
if(flag==0)//若果flag不为0,表示没有相同的单词,则加入该单词
re++;
}
memset(s,'\0',sizeof(s)); //这里清空两个字符数组,从而不影响下次循环使用。
memset(w,'\0',sizeof(w));
printf("%d\n",re);//最后将单词个数进行输出
}
return 0;
}
本题收获
strcmp
strcmp函数是string
compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
memset
memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
!
void *memset(void *s, int ch, size_t n); 函数解释:将s中当前位置后面的n个字节 (typedefunsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 [1] 。
memset()函数原型是extern void *memset(void *buffer, int c, int count)
buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度.
字符串的输入
gets(s)
gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。