1

Функция считает слова и символы в строке. Затем количество слов и строк заносится в массив. Строка вводится из файла или консоли.

for (int i = 0; i < total_lines; ++i)
        {
                
            int c, words, chars, condition;                
            c = words = chars = 0;                                    
            condition = OUT;
            while ((c = getc (input)) != '\n' && '\r') 
        
            {
                ++chars;
                if (c == ' ' || c == '\n' || c == '\t')
                    condition = OUT;
                else if (condition == OUT) 
                    {
                    condition = IN;
                    ++words;
                    }
            }
            printf ("words:%d chars:%d\n", words, chars);

            words_base[i] = words;
            printf ("%d\n", words_base[i]);
        }

Пример работы:

total lines:3
words:3 chars:9
words:1 chars:6
words:5 chars:3


Нужно отсортировать строки по количеству слов. Как это можно сделать?


Заранее спасибо.

2

массив. в каждом элементе строка и кол-во слов  в ней.
при получении очередной строки вставляете ее в нужную позицию в массиве.

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

3

точнее, пожалуй, будет сказать не массив, а связанный список

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

4

На словах вроде понял, но слабо себе представляю, как это реализовать(

5

Pek1neZ пишет:

Нужно отсортировать строки по количеству слов. Как это можно сделать?

man qsort

6

Если qsort'ом отсортирую массив из количества слов, порядок строк ведь не изменится?
Или я что-то не так понял?

7

Pek1neZ пишет:

На словах вроде понял, но слабо себе представляю, как это реализовать(

список?

struct List{
List *next;
int data;
};

// последний эл-т указывает на NULL
// первый эл-т
List *first = NULL;// список вначале пуст

//вставка в нужную позицию
// например список такой 10 20 30 40
// вставляем 27 после 20
void insert(int d)
{
List *p = first;
while(*p && p->next && p->data < d && p->data->next < d)
 p = p->next;
List *n = malloc(sizeof(List));
if(*p)
{
if(p->next)
{
n->next = p->next;
p->next = n;
}
else
// дальше сами, лениво писать

8

Pek1neZ пишет:

Если qsort'ом отсортирую массив из количества слов, порядок строк ведь не изменится?
Или я что-то не так понял?

а вы сделайте не несколько массивов, а один массив структур

struct Word{
char *string;
int count;
};

а потом его отсортируйте.

Это кстати куда как грамотнее и быстрее связанного списка.

9

Елки-палки, с qsort'ом разобраться не могу(

struct structure                                  
    {
    char c;
    int words;
    };

structure *pt = (structure*) malloc (total_lines * sizeof(structure));            //разместил массив структур в куче




int compare (const void *p1, const void *p2)       // функция сравнения
    {
    return  ((*(structure*)p1).words - (*(structure*)p2).words);
    }



 ... 


for (int i = 0; i < total_lines; ++i)                    
        {
        qsort (&(pt[i].words), total_lines*sizeof(int), sizeof (int), compare);
        printf ("%d \n", pt[i].words);
        
        }

На выводе "мусор" и несколько значений words (неотсортированных)

Что делаю не так?

10

man 3 qsort

 qsort (pt, total_lines, sizeof (structure), compare);

structure наверно всётаки {char*str; int words;}.

95% процентов проблем находятся между клавиатурой и стулом.