在C中排序字母

时间:2015-11-07 13:22:03

标签: c sorting

我有一个问题,我在C语言中的程序必须找到带有N个字母的单词,计算它们并按字典顺序对它们进行排序并将它们保存到另一个文件中。我怎么能按字母顺序对单词进行排序?

这是我的代码:

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stddef.h>
#include <string.h>

int main()
{
FILE *r, *fp;
char ch[100],t[100];
int n,i,j,x=0;


r=fopen("text.txt","r");
fp=fopen("text2.txt","w");
fgets(ch, 100, r);


char *start;
int len;
char *s = ch;
char *p = s;
printf("Give the length of word: ");
scanf("%d",&n);
printf("\n\nWords with %d letters: \n\n",n);
    while (*p) {

        while (*p && isspace(*p))
            ++p;
        start = p; 

        while (*p && !isspace(*p))
            ++p;

        len = p - start;

        if (len == n) {

            printf("%.*s\n", len, start);
              x++;

            fprintf(fp,"%.*s",len, start);

        }    
    }      


printf("\nNumber of words: %d ",x);
fclose(fp);



getch();      
fclose(r);  
} 

2 个答案:

答案 0 :(得分:3)

有一个用于排序的标准库函数:

https://en.wikipedia.org/wiki/Qsort

答案 1 :(得分:0)

编写一个按字母顺序排序单词的函数很容易,它与排序字母字符非常相似。对迭代数组的字符进行排序,并一次比较两个字符。如果第一个大于第二个字符,你交换它们并再次循环直到完成。如果是单词,你必须遍历字符串,并迭代它们的字符以进行必要的交换。这是一个例子:

#include <stdio.h>

int s_bubblesort(int argc,char **argv);

int main(void)
{
    char *elements[9] = { "zab","aaaa","bac","zzz","abc","cab","aaa","acc","aaaaaaaaa" };

    s_bubblesort(9,elements);

    for( int n = 0 ; n < 9 ; n++ )
    {
        printf("%s\n",elements[n]);
    }
}

int s_bubblesort(int argc,char **argv)
{
    //loop variables
    int i,j;

    //p_1 : pointer that points to current string,p_2 : pointer that points to next string
    char *p_1 , *p_2 , *tmp;

    for( j = 0 ; j < argc ; j++ )
    {
        for( i = 0 ; i < argc - j - 1 ; i++ )
        {
            //assign p_1 to current string,and p_2 to next string
            p_1 = argv[i] , p_2 = argv[i+1];

            //while *p_1 != '\0' and *p_2 != '\0'
            while( *p_1 && *p_2 )
            {
                //if *p_1 less than *p_2,break and move to next iteration
                if( *p_1 < *p_2 )
                    break;

                else if( *p_1 > *p_2 || ( ! *(p_2 + 1) && ( *p_1 == *p_2 ) && *(p_1+1) ) ) // if *p_1 > *p_2,or *(p_2 + 1 ) == '\0' and *p_1 == *p_2 and *(p_1 + 1 ) != '\0' { SWAP }
                {
                    tmp = argv[i];

                    argv[i] = argv[i+1];

                    argv[i+1] = tmp;

                    break;
                }
                p_1++;
                p_2++;
            }
        }
    }
    return 0;
}