Использование любых разделителей для разбивки строки на подстроки - C (СИ)

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

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

Второй раз создаю такую тему, но что ж поделать, предыдущий ответ не подошёл, да и код немного изменился. Помогите, если не трудно. Проблема вот в чём: я ввожу текст, делаю преобразования и новый текст получается разделённый только пробелами - да, я сам так и сделал, но иного придумать не могу. Как сделать так, чтобы текст был отделён теми же разделителями, которые были в изначальном? Код таков:
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h" 
#include "stdio.h" 
#include "windows.h" 
#include "iomanip" 
#include "string.h"
 
int main()
{
    setlocale(LC_ALL, "Russian"); //Установка русского языка 
 
    FILE *from_file, *in_file; //Указатели для файлов
 
    printf("Открытие файла для вывода текста:");        //Открытие 
    fopen_s(&in_file, "D:\\Kursovaia\\Vivod.txt", "w"); //файла для вывод текста
    if (in_file == NULL) printf("ошибка\n");            //и
    else printf("выполнено\n");                         //проверка
 
    printf("Открытие файла с символами-разделителями:");                //Открытие
    fopen_s(&from_file, "D:\\Kursovaia\\Delimiters.txt", "r");          //файла с символами-разделителями
    if (from_file == NULL) printf("ошибка\n");                          //и 
    else printf("выполнено\n");                                         //проверка
 
    char glasnie[13] = "aeiouyAEIOUY"; //Введём массив гласных и 
    int vowels = 0;                    //обнулим их начальное количество в тексте
 
    char *delimeters;                              //Введём массив разделителей из файла
    delimeters = (char*)malloc(5 * sizeof(char));  //и
    fgets(delimeters, 5, from_file);               //выделим под него память
 
    int uslovie;
    printf("Введите количество гласных:\n"); //Условие остановки ввода текста
    scanf_s("%d", &uslovie);
    getchar();
 
    int preobrazovanie;
    printf("Введите количество букв, длиннее которого вы не хотите видеть слова в тексте:\n"); //Условие преобразования текста
    scanf_s("%d", &preobrazovanie);
    getchar();
 
    char *lol;
    char *str;
    char *text;
    text = (char*)malloc(sizeof(char));       //Введём текст,       
    int i = 0;                                //соблюдая
    printf("Введите текст:\n");               //условие
    while (vowels < uslovie)
    {
        text[i] = getchar();
        for (int m = 0; m < 14; m++)
        {
            if (text[i] == glasnie[m])
            {
                vowels++;
            }
        }
        i++;
        text = (char*)realloc(text, (i + 1)*sizeof(char));
    }
    text[i] = '\0';
    printf("Введённый вами текст:\n%s\n", text);
 
    lol = strtok_s(text, delimeters, &str);
    while (lol)
    {
        if (strlen(lol) <= preobrazovanie)
        {
            fprintf(in_file, "%s ", lol);
        }
        lol = strtok_s(NULL, delimeters, &str);
    }
 
    fclose(in_file);                                   //Закроем файлы
    printf("Файл для вывода текста закрыт\n");         //для вывода текста
    fclose(from_file);                                 //и
    printf("Файл с символами-разделителями закрыт\n"); //с символами-разделителями
 
    free(delimeters);   //Правила
    free(text);         //хорошего
    system("pause");    //тона
    return 0;
}
UP!
P.S. Посмотрел все темы, решение есть, но всего одно или два и слишком для меня трудные. Во всех остальных подобных случаях слова разделены лишь пробелом, а у меня они разделены могут быть чем угодно.
UP! Приму любой совет, не обязательно писать код.
Напомню в чём заключается программа: останавливает ввод при достижение определённого количества гласных и удаляет слова длиннее определённой длины, слова могут быть разделены разделителями из файла.

Решение задачи: «Использование любых разделителей для разбивки строки на подстроки»

textual
Листинг программы
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h" 
#include "stdio.h" 
#include "windows.h" 
#include "iomanip" 
#include "string.h"
#include "malloc.h"
 
int main()
{
    setlocale(LC_ALL, "Russian"); //Установка русского языка 
 
    FILE *from_file, *in_file; //Указатели для файлов
 
    printf("Открытие файла для вывода текста:");        //Открытие 
    fopen_s(&in_file, "D:\\Kursovaia\\Vivod.txt", "w"); //файла для вывод текста
    if (in_file == NULL) printf("ошибка\n");            //и
    else printf("выполнено\n");                         //проверка
 
    printf("Открытие файла с символами-разделителями:");                //Открытие
    fopen_s(&from_file, "D:\\Kursovaia\\Delimiters.txt", "r");          //файла с символами-разделителями
    if (from_file == NULL) printf("ошибка\n");                          //и 
    else printf("выполнено\n");                                         //проверка
 
    char glasnie[13] = "aeiouyAEIOUY"; //Введём массив гласных и 
    int vowels = 0;                    //обнулим их начальное количество в тексте
 
    char *delimeters;                              //Введём массив разделителей из файла
    delimeters = (char*)malloc(5 * sizeof(char));  //и
    fgets(delimeters, 5, from_file);               //выделим под него память
 
    int uslovie;
    printf("Введите количество гласных:\n"); //Условие остановки ввода текста
    scanf_s("%d", &uslovie);
    getchar();
 
    int preobrazovanie;
    printf("Введите количество букв, длиннее которого вы не хотите видеть слова в тексте:\n"); //Условие преобразования текста
    scanf_s("%d", &preobrazovanie);
    getchar();
 
    char *lol;
    char *str;
    char *text;
    text = (char*)malloc(sizeof(char));       //Введём текст,       
    int i = 0;                                //соблюдая
    printf("Введите текст:\n");               //условие
    while (vowels < uslovie)
    {
        text[i] = getchar();
        for (int m = 0; m < 14; m++)
        {
            if (text[i] == glasnie[m])
            {
                vowels++;
            }
        }
        i++;
        text = (char*)realloc(text, (i + 1)*sizeof(char));
    }
    text[i] = '\0';
 
    printf("Введённый вами текст:\n%s\n", text);
 
    char* pos = text; // указатель на текущий символ в строке для разюора
    lol = strtok_s(text, delimeters, &str);
    while (strchr(delimeters, *pos))
        putchar(*pos++); // выводим разделители в начале строки(если есть)
    while (lol)
    {
        size_t len = strlen(lol);
        if (len <= preobrazovanie)
        {
            fprintf(in_file, "%s", lol); // убираем пробел
        }
        pos += len;
        while (strchr(delimeters, *pos))
        {
            fputc(*pos++, in_file);
        }                                           // выводим разделители
        lol = strtok_s(NULL, delimeters, &str);
    }
 
    fclose(in_file);                                   //Закроем файлы
    printf("Файл для вывода текста закрыт\n");         //для вывода текста
    fclose(from_file);                                 //и
    printf("Файл с символами-разделителями закрыт\n"); //с символами-разделителями
 
    free(delimeters);   //Правила
    free(text);         //хорошего
    system("pause");    //тона
    return 0;
}

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

  1. Объединение и связывание всех вводимых строк в одну большую строку.
  2. Разделение большой строки на подстроки по определенным правилам (например, по количеству гласных).
  3. Присваивание каждой подстроке уникального идентификатора (например, номера).
  4. Сохранение полученных подстрок в файл для дальнейшего использования.
  5. Использование функций работы со строками для обработки и преобразования этих подстрок (например, удаление пробелов).
  6. Использование функций работы с файлами для чтения и записи данных в файл.
  7. Использование функций работы с памятью для выделения и освобождения памяти, используемой этими подстроками и идентификаторами.
  8. Использование условных операторов и циклов для контроля и управления процессом объединения, разделения и обработки строк.
  9. Ввод и вывод данных с помощью функций scanf_s и printf, а также функций ввода-вывода файлов fopen, fgets, fprintf, fputc и fclose.
  10. Использование функции realloc для динамического изменения размера выделенной памяти.
  11. Использование функции strlen для определения длины строки.
  12. Использование функции strtok_s для разделения строки на подстроки по определенным разделителям.
  13. Использование функции getchar для чтения символов из стандартного ввода.
  14. Использование функции system для выполнения системной команды (в данном случае, для приостановки выполнения программы до нажатия клавиши).
  15. Использование функции free для освобождения памяти, выделенной функцией malloc.
  16. Использование функции putchar для вывода символов в стандартный вывод.
  17. Использование функции sprintf для форматирования и записи строки в файл.
  18. Использование функции isalpha для проверки, является ли символ буквой.
  19. Использование функции strchr для поиска первого вхождения символа в строке.
  20. Использование функции memset для очистки выделенной памяти.

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


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

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

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