Отсортировать строки по алфавиту - C (СИ)

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

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

Здравствуйте! Есть 2 файла.

input.txt:

Форум программистов и сисадминов Привет всем Как дела Сегодня жарко

output.txt:

Как дела Привет всем Сегодня жарко Форум программистов и сисадминов
Тоесть, первый программа берет 1 букву каждой строки и сортирует их по алфавиту. Помогите написать. Заранее благодарен.

Решение задачи: «Отсортировать строки по алфавиту»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
 
#define _GNU_SOURCE
 
#define INPUT_FILE_NAME "input.txt"
#define OUTPUT_FILE_NAME "output.txt"
 
int asc_cmp(const void * a, const void * b) {
    return wcscmp(*(wchar_t**)a, *(wchar_t**)b);
}
 
int main(void) {
    wchar_t buf[BUFSIZ], ** strings;
    size_t count, i;
    FILE * f;
    
    setlocale(LC_ALL, "ru_RU.utf8");
    
    if ( ! ( f = fopen(INPUT_FILE_NAME, "r") ) ){
        fprintf(stderr, "Can't open file %s for input!\n", INPUT_FILE_NAME);
        exit(1);
    }
    
    for ( strings = NULL, count = 0; fgetws(buf, BUFSIZ, f); ++count ) {
        if ( ! ( strings = realloc(strings, sizeof(wchar_t*) * (count + 1)) ) || ! ( strings[count] = wcsdup(buf) ) ) {
            fprintf(stderr, "Memory error!\n");
            if ( fclose(f) )
                fprintf(stderr, "Can't properly close input file!\n");
            exit(1);
        }
    }
    
    if ( ferror(f) || fclose(f) ) {
        fprintf(stderr, "Something is wrong with input file!\n");
        exit(1);
    }
    
    if ( ! count ) {
        fprintf(stderr, "Input file is empty!\n");
        exit(1);
    }
    
    qsort(strings, count, sizeof(wchar_t*), asc_cmp);
    
    if ( ! ( f = fopen(OUTPUT_FILE_NAME, "w") ) ) {
        fprintf(stderr, "Can't open file %s for output!\n", OUTPUT_FILE_NAME);
        exit(1);
    }
    
    for ( i = 0; i < count; ++i ) {
        if ( fputws(strings[i], f) < 0 ) {
            fprintf(stderr, "Can't write to output file!\n");
            if ( fclose(f) )
                fprintf(stderr, "can't properly close output file!\n");
            exit(1);
        }
    }
    
    for ( i = 0; i < count; ++i )
        free(strings[i]);
    free(strings);
    
    if ( fclose(f) ) {
        fprintf(stderr, "Can't properly close output file!\n");
        exit(1);
    }
    
    fprintf(stderr, "Done.\n");
    exit(0);
}

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

Код открывает файл с входными данными, считывает строки из этого файла и сохраняет их в массиве строк. Затем он сортирует этот массив строк в алфавитном порядке с помощью функции qsort и функции сравнения asc_cmp. После этого код открывает файл для записи, записывает отсортированные строки в этот файл и закрывает его. Если при работе с файлами или памятью возникает ошибка, код выводит сообщение об ошибке и завершает работу с кодом 1. В конце код выводит сообщение Done и завершает работу с кодом 0.

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


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

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

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