这题描述错了。。不是按照次数降序,而是单词升序。。。

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

typedef struct{
    char word[20];
    int cnt;
}Word;

int cpr(const void * a,const void* b)
{
    Word * x = (Word *) a;
    Word * y = (Word *) b;
    return strcmp(x->word,y->word);
}
int main()
{
    char str[1000];
    char temp[20];
    Word w[1000];
    int i,j = 0,k = 0,l = 0;
    int flag = 0;//1表示单词存在于字典中,0表示是新单词
    gets(str);
    for(i = 0;i<strlen(str);i++)
    {
        if(isalpha(str[i])) // 是字母
            temp[j++] = tolower(str[i]);
        else if(str[i] == ' ' || str[i] == ',' || str[i] == '.') //单词结束
        {
            temp[j] = '\0';
            j = 0;
            flag = 0;
            if(temp[0]!='\0')//非空单词
            {
                for(k = 0;k<l;k++) // 比较单词是否在字典中
                {
                    if(!strcmp(w[k].word,temp)) // 在字典中
                    {
                        w[k].cnt++;
                        flag = 1;
                        break;
                    }
                }
                if(!flag) // 不在字典中
                {
                    strcpy(w[l].word,temp);
                    w[l].cnt = 1;
                    l++;
                }
            }
            else
                continue;
        }
        else // 其他字符
            temp[j++] = str[i];
    }
    qsort(w,l,sizeof(w[0]),cpr);
    for(i = 0;i<l;i++)
        printf("%s:%d\n",w[i].word,w[i].cnt);
    return 0;
}