1

I have a problem, my program in C have to find words with N letters, count them and sort them in lexicographical order and save them to an another file. How could I sort the words in alphabetical order?

this is my code:

#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);  
} 
zse
  • 49
  • 3

2 Answers2

3

There's a standard library function for sorting:

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

Nat Goodspeed
  • 105
  • 1
  • 1
  • 7
0

It's easy to write a function to sort words alphabeticly it is very similar to sorting alphabetic characters.to sort characters you iterate over the array and compare two characters at a time.if the first is greater than the second,you swap them and loop again until finished.In case of words,you have to iterate over strings,and the iterate over their characters to make the necessary swap.Here is a example :

#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;
}
machine_1
  • 4,266
  • 2
  • 21
  • 42