СИ В каждой строке вставить после знаков препинания пробелы, если их там нет
Нужно немного подправить эту программу, а именно нужно, чтобы после любого знака препинания (если стоит уже пробел) больше пробел не ставился и после любого знака препинания (если не стоит пробел) ставился. Т.Е. дан исходный текстовый документ, где нужно разместить там где хранится программа. Запустить его и текст выводит его на экран, а затем обработки, новый текст с выделением пробела, через знак препинания.
И если можете (не обязательно) сделать вызов файла, не так как тут, а через консоль (работа через консоль), а именно через параметры.
//Задание: В каждой строке вставить после знаков препинания пробелы, если их там нет
#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);
}