题目链接
做这道题的时候,被 如何判断后面的单词是否与前面的单词相同 这个问题难住了,后面实在做不出来看了这篇HDU-2072 单词数——底层C语言解法后,顿时清醒了,
原来可以借助结构体数组来存储每个单词,数组的下标 i 就代表第i + 1个单词,再用strcmp函数来判断后面的单词是否与前面的已经存入到结构体数组中的单词相同,不得不感叹,大佬就是大佬哇!!
AC代码:
#include<stdio.h>
#include<string.h>
typedef struct
{
char str [ 25 ] ;
}arr ;
arr x [ 10000 ] ;
char a [ 10000 ] ;
int main( void )
{
int i , j , k , len , n , sum , m , flag ;
while( gets( a ) != NULL )
{
if ( strcmp( a , "#" ) == 0 )//#要用“”括起来,代表字符串,而不能使用‘’,否则产生Runtime Error(ACCESS_VIOLATION)
break ; //因为strcmp函数比较的是两个字符串
j = 0 ;//数组a中的下标
sum = 0 ;//不同的单词数
n = 0 ; //单词总数
k = 0 ; //结构体数组中str数组的下标
len = strlen( a ) ;
if ( a [ 0 ] >= 'a' && a [ 0 ] <= 'z' )//防止字符串第一个元素是空格
sum++;
for ( i = 0 ; i < len ; i++ )
{
if ( i == 0 || ( a [ i - 1 ] == ' ' && a [ i ] != ' ' ) )
{
j = i ;
while( 1 )
{
x [ n ].str[ k ] = a[ j ] ;//把单词存入结构体数组中
k++ ; j++ ;
if ( a [ j ] == ' ' || j == len )
{
x [ n ].str[ k ] = '\0' ;//添加字符数组结束标志符
k = 0 ;
n++ ;
break ;
}
}
if ( n > 1 ) //用来判断是否有相同的单词
{
flag = 0 ;
for( m = 0 ; m < n - 1 ; m++ )
{
if ( strcmp( x[ n - 1 ].str , x[ m ].str ) == 0 )
{
flag = 1 ;
break ;
}
}
if ( flag == 0 )
sum++ ;
}
}
}
printf( "%d\n" , sum ) ;
}
return 0 ;
}