Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2022, 03:03   #1
Aleksey7754
 
Регистрация: 22.05.2022
Сообщений: 5
По умолчанию СИ В каждой строке вставить после знаков препинания пробелы, если их там нет

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

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

Код:
//Задание: В каждой строке вставить после знаков препинания пробелы, если их там нет
 
#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);
}
Вложения
Тип файла: txt inf.txt (1.3 Кб, 0 просмотров)
Aleksey7754 вне форума Ответить с цитированием
Старый 11.06.2022, 03:20   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Aleksey7754 Посмотреть сообщение
Код:
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] = '  ';
        }
Код:
char znaki[] = ".,<>?!:\/|';&^%$#*+-=()[]`~";
    int slen = strlen(x); // Зачем постоянно считать длину?
    for (int i = 0; x[i] != '\0'; i++)
        if (strchr(znaki,x[i]) != NULL)
        {
            if (i < slen - 1 && x[i + 1] != ' ') // Не добавляем пробел, если он есть
            {
                for (int t = slen-1; t >= i; t--)
                    x[t+1] = x[t];
                x[i+1] = '  ';
                slen++; // Просто учитываем добавленные символы
            }
        }
Код:
int main(int an, char *av[]) // an количество параметров, av - массив строк с параметрами. Просто в цикле поищите тут имя файла
macomics вне форума Ответить с цитированием
Старый 11.06.2022, 03:24   #3
Aleksey7754
 
Регистрация: 22.05.2022
Сообщений: 5
По умолчанию

Работает, теперь как надо!

Последний раз редактировалось Aleksey7754; 11.06.2022 в 03:26.
Aleksey7754 вне форума Ответить с цитированием
Старый 11.06.2022, 03:26   #4
Aleksey7754
 
Регистрация: 22.05.2022
Сообщений: 5
По умолчанию

macomics, Учту, Благодарю Вас за быстрый ответ! Выручили. )
Aleksey7754 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В односвязном списке вставить после каждой * символ _ nonameii3ii Помощь студентам 2 21.05.2021 09:51
вставить пробелы после “.” и “...”, если длина самого длинного слова меньше кол-ва слов. Anton_04_1 Помощь студентам 0 02.12.2016 00:15
Вставить пробел до и после каждой цифры текста LittleStudent Помощь студентам 2 14.04.2011 22:48
пробелы после каждой буквы KeksK Общие вопросы .NET 3 05.05.2010 12:13
последовательность знаков препинания Владимир_король Помощь студентам 3 29.04.2010 10:56