Вывести строку с текстового файла так, чтобы слова располагались в алфавитном порядке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

необходимо вывести строку с текстового файла так, чтобы слова были в алфавитном порядке...реализовал, но не правильно - выводит по алфавиту но не слова, а буквы((не знаю как отделать слова друг от друга и выводить не сплошные буквы, а слова по алфавиту на англ.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int compare (const void *a, const void *b)
{
  return *(char*)a - *(char*)b;
}
 
int main() {
    FILE *f;
    char *s;
    long int l;
    int i;
 
    if ( (f = fopen("func.txt", "r")) == NULL ) exit(0);
    fseek(f, 0, SEEK_END);
    l = ftell(f) + 1;
    fseek(f, 0, SEEK_SET);
    s = (char *)malloc(l);
    l = fread(s, 1, l, f);
    s[l] = '\0';
    qsort (s, strlen(s), sizeof(char), compare);
    printf("%s\n", s);
    fclose(f);
    getchar();
}

Решение задачи: «Вывести строку с текстового файла так, чтобы слова располагались в алфавитном порядке»

textual
Листинг программы
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
#define MAXT 100  //максим. число слов
 
 
// функция сравнения - для использования в стандартной
// функции qsort
int compare_words( const void *arg1, const void *arg2 )
{
   char **s1,**s2;
   s1=(char**)arg1;
   s2=(char**)arg2;
   return strcmp(s1[0],s2[0]);
}
 
 
void main( int argc, const char* argv[] )
{
char *words[MAXT]; // массив на 100 указателей под слова
FILE *file;
long size;
char *buffer;
char seps[]   = " \t\r\n"; //символы разделители слов
char *token;
int it,i,len;
 
 
   if(argc != 2) // проверяем был ли передан параметр из командной строки
   {
      puts("\nUsage: program <FILE.txt>");
      return ;
   }
 
   file=fopen(argv[1],"r+t"); // Используем переданный параметр как имя файла с текстом для разбора по словам
 
   fseek(file,0,SEEK_END); // устанавливаем текущую позицию в файле в его конец
   size=ftell(file);             // определяем размер файла
 
   buffer=(char*)malloc(size+1); // выделяем память под чтение всего содержимого файла
 
   fseek(file,0,SEEK_SET);  // устанавливаем текущую позицию в файле в его начало
 
   size=fread(buffer,1,size,file); // читаем из фала все его содержимое в буфер
   buffer[size]=0; // в последнюю позицию после прочитанного ставим ноль - признак конца строки
   fclose(file);// закрываем файл
   
  
   it=0; // счетчик найденных слов
   
   token = strtok( buffer, seps ); // начинаем обработку буфера по вытаскиванию слов разделенных пробелами
 
   while( token != NULL ) // если очередное слово есть, то продолжаем цикл
   {
 
     len=strlen(token);// размер нового слова в символах
 
     if( len > 0 ) 
    {
 
    /*ищем дубликат найденного слова в массиве уже найденных слов*/ 
     i=0;
     while( i < it )
     {
       if( strcmp(words[i],token) == 0 ) break;
        i++;
     }
 
     if( i == it )  // если дошли до конца массива, то слово в массиве нет и мы его добавляем в массив
    {
        if(it==MAXT){printf("\nВ массиве нет места под слова"); break;}
 
      
      /* добавляем в массив найденных слов с проверкой */
 
        words[it]=(char*)malloc(len+1); // выделяем память под хранение нового слова
        strcpy(words[it],token);         // и копируем его на место хранения в памяти
        
        it++; // увеличиваем счетчик найденных слов
      
     }
 }   
      /* взять следующее слово */
      token = strtok( NULL, seps );
   }
 
    printf("\n Найдено слов: %d",it);
 
   /*сортируем массив слов в алфавитном порядке*/
    qsort(words,it,sizeof(char*),compare_words);// вызов стандартной функции сортировки элементов массива
 
    printf("\nСписок слов");
 
    for(i=0; i < it; i++) printf("\n %s",words[i]); // печатаем список слов в столбик
 
    for(i=0; i < it; i++) free(words[i]); // освобождаем память выделенную для хранения слов
    free(buffer);
}

Объяснение кода листинга программы

  1. Объединение строк с использованием оператора + может привести к ошибкам при работе с большими объемами данных, так как он работает с ограниченным количеством памяти, что может привести к переполнению буфера. Вместо этого следует использовать функции, специально предназначенные для работы с большими объемами данных, такие как strdup или asprintf.
  2. При использовании функции strcpy следует быть внимательным, так как она копирует строку, начиная с указанного указателя, до первого нулевого символа. Если в исходной строке нет нулевого символа, то при попытке копирования всей строки память под копию будет выделена неправильно.
  3. Вместо использования функции fread для чтения содержимого файла следует использовать функцию fscanf, которая может обрабатывать символы новой строки.
  4. При использовании функции malloc следует проверить, что выделение памяти прошло успешно, чтобы избежать ошибок при работе с некорректным указателем.
  5. При использовании функции strcmp для сравнения строк следует быть внимательным, так как она возвращает значение <0, если первая строка меньше второй, 0, если строки равны, и >0, если первая строка больше второй.
  6. При использовании функции qsort следует указать, что сравниваются указатели на строки, а не сами строки, чтобы функция работала корректно.
  7. При использовании функции printf для вывода списка слов следует добавить форматирование, чтобы слова выводились на новой строке.
  8. При использовании функции free для освобождения памяти следует быть уверенным, что указатель, передаваемый в функцию, является корректным.
  9. При использовании функции strdup для дублирования строки следует проверить, что выделение памяти прошло успешно, чтобы избежать ошибок при работе с некорректным указателем.
  10. При использовании функции asprintf следует проверить, что выделение памяти прошло успешно, чтобы избежать ошибок при работе с некорректным указателем.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы