查找字符串中最长的和最短的单词,最长和最短可能不止一个,并统计起格式
#include < stdio. h>
#include < stdlib. h>
#include < string. h>
#define LEN 20
struct Word{
char * name;
int len;
} tmp;
void destroys ( struct Word * arr, int j)
{
for ( int i = j; i < LEN ; i++ ) {
free ( arr[ i] . name) ;
arr[ i] . name = NULL ;
}
}
void initWords ( struct Word * arr, char * str)
{
char * p = strtok ( str, " ,." ) ;
int i = 0 ;
while ( p != NULL ) {
arr[ i] . name = malloc ( strlen ( p) + 1 ) ;
strcpy ( arr[ i] . name, p) ;
arr[ i] . len = strlen ( p) ;
p = strtok ( NULL , " ,." ) ;
i++ ;
}
}
void mySort ( struct Word * arr)
{
for ( int i = 0 ; i < LEN - 1 ; i++ ) {
for ( int j = 0 ; j < LEN - 1 - i; j++ ) {
if ( arr[ j] . len > arr[ j + 1 ] . len) {
tmp = arr[ j] ;
arr[ j] = arr[ j + 1 ] ;
arr[ j + 1 ] = tmp;
}
}
}
}
void func ( char * str)
{
struct Word arr[ LEN ] = { 0 } ;
initWords ( arr, str) ;
mySort ( arr) ;
int count_max = 0 ;
int count_min = 0 ;
int i, j;
int len_max = arr[ LEN - 1 ] . len;
int len_min = 0 ;
for ( i = LEN - 1 ; i >= 0 ; i-- ) {
if ( arr[ i] . len == len_max) {
count_max++ ;
}
else {
break ;
}
}
for ( j = 0 ; j < LEN ; j++ ) {
if ( arr[ j] . len != 0 ) {
len_min = arr[ j] . len;
break ;
}
}
for ( int k = j; k < LEN ; k++ ) {
if ( arr[ k] . len == len_min) {
count_min++ ;
}
else {
break ;
}
}
printf ( "最短的单词共%d个,长度为%d, 分别是:%s" , count_min, len_min, arr[ j] . name) ;
for ( int k = 1 ; k < count_min; k++ ) {
printf ( ", %s" , arr[ j+ k] . name) ;
}
printf ( "\n最长的单词共%d个,长度为%d, 分别是:%s" , count_max, len_max, arr[ LEN - count_max] ) ;
for ( int k = LEN - count_max+ 1 ; k < LEN ; k++ ) {
printf ( ", %s" , arr[ k] . name) ;
}
printf ( "\n" ) ;
destroys ( arr, j) ;
}
int main ( )
{
char str[ 100 ] = "Mike Shinoda, Rob Bourdon, and brad Delson " ;
func ( str) ;
return 0 ;
}