Description
统计一篇文章里不同单词的总数。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。每篇文章的单词数小于1000,每个单词最多由30个字母组成。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend#
Sample Output
4
HINT
Source
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//代码过于的冗杂繁琐
typedef struct word
{
char str[32];
} W;
int main()
{
W p[1001];
char str1[1000];//这里曾经错过,范围开的过小,因为输入的是一行的单词
int i,j,k;
int count = 0;
while(strcmp((gets(str1)),"#")!=0)
{
memset(p,'\0',sizeof(p));//每篇文章都进行初始化
i=0;
count=0;
k=0;
while(str1[i]!='\0')
{
j=0;
while(str1[i]==' ')
i++;
for( ; str1[i]!=' '&&str1[i]!='\0'; i++)
{
p[k].str[j++]=str1[i];
}
for(j=0; j<k; j++)
{
if(strcmp( p[k].str, p[j].str)==0)
{
count--;
break;//只要找到相同的即跳出循环
}
}
count++;
k++;
while(str1[i]==' ')//不是多余的,此处为了避免单词后有多个空格
i++;
}
printf("%d\n",count);
}
return 0;
}
下面这是大佬的一段简洁的代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char arr[]="#",str[30000];
while(gets(str),strcmp(str,arr)!=0)
{
char p[30][1010];
int i=0,j=0,k=0;
while(i<strlen(str))
{
if(str[i]==' ')
while(str[i]==' ')
i++;
else
{
while(str[i]!=' ')
p[j][k++]=str[i++];
p[j][k]='\0';
j++;
k=0;
}
}
int ans=0;
for(i=0;i<j;i++)
{
int t=0;
for(k=0;k<i;k++)
{
if(strcmp(p[i],p[k])==0)
{
t=1;
break;
}
}
if(t==0)
ans++;
}
printf("%d\n",ans);
}
return 0;
}