Не могу реализовать прогу, нужна помощь!

Исходный файл содержит текст, состоящий из букв и других символов (цифр, пробелов, точек, запятых, тире и т.д.). Известно, что каждая строка исходного текста состоит из слов, разделенных пробелами, часть из которых являются палиндромами, в которых не учитывается возможное наличие символов, отличных от букв. Используя один дек, выделить все палиндромы каждой строки (строчные и прописные буквы не различаются) и записать в новый файл. Пример: исходный текст Fy23yf! 35Fab6f B5Kfltgj-gjgtlfkb y.TРfh?Fpty. Результат выделения палиндромов: Fyyf BKfltgjgjgtlfkb yTpfhFpty

Я не могу реализовать правильно функцию сравнения через дек (почему-то не работает с нечетным количеством символов), также не знаю как сделать сравнивать одинаковые строчную и прописную буквы, а также, если подключать, не работает функция выборки только букв.

Вот мои наработки:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "Lab15.h"
#include <locale.h>
#include <sstream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

using namespace std;
#define FNAME_I "st_i.txt"//имя исх. файла задано константной строкой
#define FNAME_R "st_r.txt"//имя рез. файла задано константной строкой
const int RAZ = 81;             //максимальная длина строки
const char PR_R[] = "r";            //признак открытия файла на чтение
const char PR_W[] = "w";            //признак открытия файла на запись

typedef char t_elem;    //тип информационной части элемента очереди
struct ocher        //тип элемента очереди
{
    t_elem data;        //поле данных
    ocher* link;        //поле адреса
    //ocher* prev;        //поле обратного адреса
};

//Объявления (прототипы) функций
void make_file(char*);          //функция создания файла
int proverka_file(char*, const char*);  //функция проверки наличия файла
void vivod_file(char*); //вывод содержимого файла на печать
void processing(char*, char*);
char* check(char*);

//Объявления (прототипы) функций для работы с очередью
void init_ocher(ocher**, ocher**);      //инициализация очереди
int pu_ocher(ocher*);                   //проверка очереди на пустоту
void view_ocher(ocher*);                //вывод содержимого очереди
void add_ocher(t_elem, ocher**, ocher**);   //добавление элемента
ocher* del_ocher(ocher*, t_elem&);  //удаление элемента из очереди
ocher* del_end(ocher*, ocher*, t_elem&); //удаление последнего элемента из очереди

//main__begin_________________________________________________________________________
int main()
{
    char fname_i[] = FNAME_I;
    char fname_r[] = FNAME_R;
    setlocale(LC_ALL, "Russian");
    make_file(fname_i);

    //выводим его содержимое
    if (!proverka_file(fname_i, PR_R))
    {
        cout << " Ошибка открытия файла " << fname_i << " на чтение" << endl << " Нажмите <Enter>" << endl;
        getchar();
        return 0;           //если исходный файл не создан
    }
    cout << " Содержимое исходного файла:" << endl;
    vivod_file(fname_i);

    //processing 
    processing(fname_i, fname_r);

    //выводим содержимое результата
    if (!proverka_file(fname_r, PR_R))
    {
        cout << " Ошибка открытия файла " << fname_r << " на чтение" << endl <<
            " Нажмите <Enter>" << endl;
        getchar();
        return 0;           //если результирующий файл не создан
    }
    cout << " Результат " << endl;
    vivod_file(fname_r);

    cout << endl << " Для завершения нажмите <Enter>";
    getchar();
    return 0;
}

void make_file(char* fname_i)
{
    char st[RAZ];           //исходная строка
    FILE* in;               //текстовый файл
    char otv;               //ответ пользователя
   /*Открываем файл в режиме чтения (r)
   Если файл с таким именем уже есть, то либо пользователь вводит
   новое имя, либо новые записи будут записаны поверх старых*/
    while (proverka_file(fname_i, PR_R))
    {
        cout << " Файл с заданным именем уже есть! Зададите новое имя Y/N? ";
        cin.get(otv);
        if (otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н')
        {
            cout << " Введите новое имя:" << endl;
            cin >> fname_i;
            cin.get();  //убираем символ '\n' из потока
        }
        else {
            cin.get();  //убираем символ '\n' из потока
            break;
        }
    }
    /*проверяем возможность открытия файла для записи
    поскольку полное имя файла могло быть задано с ошибкой*/
    if (!proverka_file(fname_i, PR_W))
    {
        cout << " Ошибка открытия файла " << fname_i << " на запись" << endl
            << " Нажмите <Enter>" << endl;
        getchar();
        exit(0);
    }
    /*Открываем файл в режиме записи (w) текста (по умолчанию).
    Если файл с таким именем уже есть, то новые данные
    будут записаны поверх старых*/
    in = fopen(fname_i, PR_W);
    cout << " Создание файла." << endl <<
        " Признак окончания ввода - ввод пустой строки" << endl <<
        " Введите строку и нажмите <Enter>" << endl << " ->";
    cin.getline(st, RAZ); /*функция вводит строку целиком, включая
                     пробелы и символ \n*/
    while (strlen(st))
    {
        fprintf(in, "%s\n", st);
        cout << " Введите строку и нажмите <Enter>" << endl << " ->";
        cin.getline(st, RAZ);
    }
    fclose(in);     //закрываем файл
}

int proverka_file(char* fname, const char* pr)
{
    //Открываем файл
    if ((fopen(fname, pr)) == NULL) //если файл не существует
        return(0);
    return(1);
}

void vivod_file(char* fname)
{
    FILE* in_out;
    char st[RAZ];               //считанная строка

    in_out = fopen(fname, PR_R);    //открываем файл на чтение
    fgets(st, RAZ, in_out);     //читаем строку из файла in_out
    while (!feof(in_out))           //пока не найден признак конца файла
    {
        cout << st;             //выводим очередную строку на экран
        fgets(st, RAZ, in_out);     //читаем строку из файла in_out
    }
    fclose(in_out);         //закрываем файл
}

void processing(char* fname_i, char* fname_r)
{
    FILE* in, * out;        //исходный и результирующий файлы (потоки)
    char st_in[RAZ];        //обрабатываемая строка
    char st_out[RAZ];       //результирующая строка
    char* p = new char(RAZ);    //указатель на выделенное слово
    int deqsize, i=0, flag, size, j=0, k=0;
    ocher* o_beg,
        * o_end;
    t_elem ch, n;
    in = fopen(fname_i, PR_R);      //открываем файл на чтение
    out = fopen(fname_r, PR_W); //открываем файл на запись
    fgets(st_in, RAZ, in);      //читаем первую строку из файла in
    while (!feof(in))           //пока не найден признак конца файла
    {
        st_out[0] = '\0';           //очищаем результирующую строку
        p = strtok(st_in, " \n");   //выделяем первое слово (лексему).
        //p = check(p);
        while (p)
        {
            flag = 0;
            j = 0;
            init_ocher(&o_beg, &o_end);
            for (i = 0; i < strlen(p); i++)
            {
                add_ocher(p[i], &o_beg, &o_end);
            }
            while (o_beg)
            {
                o_beg = del_ocher(o_beg, ch);
                cout << ch << ' 1';
                o_beg = del_end(o_beg, o_end, n);
                cout << n << ' 2';
                if (ch == n)
                {
                    flag++;
                }
                j++;
            }
            if (flag == j)
            {
                strcat(st_out, p);
                strcat(st_out, " ");        //добавляем пробел между слов
            }
            p = strtok(NULL, " \n");        //выделение последующих слов NULL
        }
        //st_out[strlen(st_out) - 1] = '\0';    //убираем последний пробел
        if (strlen(st_out))             //если строка не пустая
            fprintf(out, "%s\n", st_out);   //записываем строку в новый файл
        fgets(st_in, RAZ, in);
    }
    fclose(in);
    fclose(out);
}

char* check(char* p)
{
    const char* letters = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
    int i = 0, j = 0, k = 0;
    char* n = p;
    while (i < strlen(p))
    {
        while (j < strlen(letters))
        {
            if (n[i] == letters[j])
            {
                p[k] = n[i];
                k++;
            }
            j++;
        }
        i++;
    }
    return(p);
}

void init_ocher(ocher** o_beg, ocher** o_end)
{
    *o_beg = NULL;  //в исходном состоянии очередь пуста
    *o_end = NULL;
    return;
}

int pu_ocher(ocher* o_beg)
{
    return(o_beg == NULL);  //очередь пуста - 0
                       //очередь не пуста - не 0
}

void view_ocher(ocher* o_beg)
{
    ocher* tec = o_beg;
    while (!pu_ocher(tec))
    {
        cout << tec->data;
        tec = tec->link;
    }
    return;
}


void add_ocher(t_elem ch, ocher** o_beg, ocher** o_end)
{
    ocher* nov = new(ocher);    //выделяем память под элемент очереди
    nov->data = ch;     //заполняем поля
    nov->link = NULL;
    if (pu_ocher(*o_beg))
    {
        *o_beg = nov;//если очередь пуста меняем адрес головы
    }
    else
    {
        (*o_end)->link = nov;       //подсоединяем новый элемент
    }
    *o_end = nov;           //указатель на последний элемент очереди
    return;
}



ocher* del_ocher(ocher* o_beg, t_elem& ch)
{
    if (o_beg != NULL)
    {
        if (o_beg->link != NULL)
        {
            ocher* tec = o_beg->link;   //меняем адрес головы
            ch = o_beg->data;   //копируем информационную часть головного элемента
            delete(o_beg);      //освобождаем память
            return(tec);        //возвращаем новый адрес головы
        }
        else
        {
            ch = o_beg->data;
            delete(o_beg);
            o_beg = NULL;
            return(o_beg);
        }
    }
    else
    {
        o_beg = NULL;
        return(o_beg);
    }
}

ocher* del_end(ocher* o_beg, ocher* o_end, t_elem& n)
{
    if (o_beg != NULL)
    {
        if (o_beg->link != NULL)
        {
            ocher* beg = o_beg;
            ocher* tec = o_beg->link;
            while (tec->link != NULL)
            {
                tec = tec->link;
                beg = beg->link;
            }
            n = tec->data;
            beg->link = NULL;
            delete(tec);
            return(o_beg);
        }
        else
        {
            n = o_beg->data;
            delete(o_beg);
            o_beg = NULL;
            return(o_beg);
        }
    }
}

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