СИ В каждой строке вставить после знаков препинания пробелы, если их там нет

Нужно немного подправить эту программу, а именно нужно, чтобы после любого знака препинания (если стоит уже пробел) больше пробел не ставился и после любого знака препинания (если не стоит пробел) ставился. Т.Е. дан исходный текстовый документ, где нужно разместить там где хранится программа. Запустить его и текст выводит его на экран, а затем обработки, новый текст с выделением пробела, через знак препинания.

И если можете (не обязательно) сделать вызов файла, не так как тут, а через консоль (работа через консоль), а именно через параметры.

//Задание: В каждой строке вставить после знаков препинания пробелы, если их там нет
 
#define _CRT_SECURE_NO_WARNINGS
#define _GNU_SOURCE
 
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
 
int main(int an, char *av[])
{
    setlocale(LC_ALL, "Rus"); //ПОДКЛЮЧЕНИЕ РУССКОГО ЯЗЫКА
 
    int v, p=0;
 
char ch;
    do
    {
        system("cls");
 
    printf("Добро пожаловать! Выберите тип ввода текста: 1 - чтение из текстового документа, 2 - ручной ввод текста");
 
    ch=getch();
        if (ch == 0)
        ch = getch();
            switch(ch)
{
case '1':
    {
    FILE *inf, *outf; /* файловые переменные */
    char x[100000]; /* входной буфер */
 
        printf("\n\nИтак, вы выбрали тип 'ЧТЕНИЕ ИЗ ТЕКСТОВОГО ДОКУМЕНТА'");
        getch();
 
        printf("\nОткрываем текстовый документ 'inf.txt'");
 
    {
          /* открытие файлов */
  if ((inf=fopen("inf.txt","rt"))==NULL) {
    printf("Невозможно открыть файл: %s\n");
    exit(0);
    }
  if ((outf=fopen("TMP","wt"))==NULL) {
    printf("Невозможно создать файл: TMP\n");
    exit(0);
    }
    /* открытие выходного файла out.txt */
  if ((outf=fopen("outf.txt","wt"))==NULL) {
    printf("Невозможно открыть файл: %s\n","out.txt");
    exit(0);
    }
    }
 
        {
            printf("\n\n<< ИСХОДНЫЙ ТЕКСТ ИЗ ТЕКСТОВОГО ДОКУМЕНТА >>\n");
            fgets(x,100000,inf);
            puts(x);
            fclose(inf); //закрываем, чтобы указатель при следующем открытии стал вначало файла.
            getch();
        }
 
    {
char znaki[] = ".,<>?!:\/|';&^%$#*+-=()[]`~";
    for (int i = 0; x[i] != '\0'; i++)
        if (strchr(znaki,x[i]) != NULL) //Функция strchr() возвращает указатель на местонахождение первого совпадения с символом в строке X
        {
            for (int t = strlen(x)-1; t >= i; t--) //Функция strlen () вычисляет длину заданной строки
                x[t+1] = x[t];
            x[i+1] = '  ';
        }
    }
 
        {
            printf("\n\n<< ОБРАБОТАННЫЙ ТЕКСТ ИЗ ТЕКСТОВОГО ДОКУМЕНТА >>\n");
            puts(x);
 
 
            printf("\n\nГОТОВО! Хотите записать в текстовый документ? 1-да; 2-нет, пропустить\n");
            scanf("%d", &v);
 
            if(v==1)
            {
            printf("\nЗаписывем обработанный текст в текстовый документ под названием 'outf.txt'\n");
            fclose(inf);
            freopen("outf.txt", "w", outf);
            fputs(x, outf); //запись текста в файл
            fclose(outf);
            getch();
                return 0;
            p=1;
            }
            else
                if(v==2)
                {
                    printf("\nХорошо! Спасибо!\n");
                    getch();
                        return 0;
                    p=1;
                }
        }
    }
 
case '2':
    {
 
    FILE* f=fopen("outf_1", "wt");
    char txt[BUFSIZ]={'\0'}, *a=txt, buf[100]; //буферные значения
 
    printf("\n\nИтак, вы выбрали тип 'РУЧНОЙ ВВОД ТЕКСТА'");
    getch();
 
    printf("\n> Введите строку текста для обработки и записи в файл (желательно на 'английском'): ");
    fgets(buf, 100, stdin); //ввод с клавиатурой с размерность на 100 символов
 
    fputs(buf, f);
    fclose(f); //закрываем, чтобы указатель при следующем открытии стал вначало файла.
 
    if((f=fopen("outf_1","rt"))==NULL)
        {
            printf("Ошибка! Не удалось открыть файл!\n");
            return 0;
        }
 
    while(!feof(f)) //Функция feof проверяет наличие признака конца файла
        {
        *a=fgetc(f); //Функция fgetc() возвращает символ, взятый из входного потока и находящийся сразу после текущей позиции, а также увеличивает указатель текущей позиции файла
            if(ispunct(*a) && *(a+1)!=' ') //Функция ispunct проверяет свой аргумент, является ли его значение символом пунктуации
            *++a=' ';
            a++;
        }
    *--a='\0'; //конец строки
 
    printf("\nЗаписывем обработанный текст в текстовый документ под названием 'outf_1.txt'\n");
 
    fclose(f);
    freopen("outf_1.txt", "w", f);
    fputs(txt, f); //запись текста в файл
    fclose(f);
    getch();
    return 0;
    }
    }
}
    while(ch!=27);
}

Ответы (0 шт):