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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2022, 12:38   #1
Кот__
 
Регистрация: 11.04.2022
Сообщений: 4
Вопрос Си, Переписать с одного файла в другой функцию main

Задание звучит так:
Задан файл с текстом C-программы. Выделить и переписать в новый файл из
именем main-fun.c функцию main() из этого приложения. Подсказка: поиск конца функции
целесообразно выполнить через проверку баланса фигурных скобок {}.

Никак не пойму как реализовать, может кто-то обьяснить как я могу сделать или помочь немного. Заранее спасибо за каждый ответ!
Кот__ вне форума Ответить с цитированием
Старый 20.04.2022, 12:46   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Ищите в тексте файла (после нахождения определения int main(int argc, char** argv)) все открывающиеся '{', '}', 'строки' и 'комментарии'. Если скобочка '{', '}' в комментарии или строке, то пропускаете. Иначе на каждую '{' увеличивайте счетчик, для каждой '}' уменьшаете и проверяете на 0. Примерно так.
macomics вне форума Ответить с цитированием
Старый 20.04.2022, 12:47   #3
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

открыть файл
найти строку main(), в начале которой ничего нет, перевод строки или пробел - ОТ
с { начать считать баланс
как только найдется нужная } - ДО
скопировать ОТ и ДО
ForenLi вне форума Ответить с цитированием
Старый 27.04.2022, 08:39   #4
Кот__
 
Регистрация: 11.04.2022
Сообщений: 4
Восклицание Переписать с одного файла в другой функцию main

Задание такое:
Задан файл с текстом C-программы. Выделить и переписать в новый файл из
именем main-fun.c функцию main() из этого приложения.

Я что-то немного сделала, но где-то напортачила , потому что выводится куча букв "М" и только это "const char* find1 = "int main()", * find2 = "int main(int argc, char**) argv))"; "

Буду очень рада помощи, заранее спасибо за каждый ответ)
Код:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
#define MAXN 300
#define LENG 60
#define ROWS 100
 
int main(void) {
    system("chcp 1251");
    FILE* fp, * fc;
    int n = 0, i = 0, count1 = 0, count2 = 0;
 
    const char* fname = "D:\\Study_projects\\program4lab7.cpp";
    const char* fmain = "D:\\Study_projects\\main-fun.cpp";
    const char* find1 = "int main()", * find2 = "int main(int argc, char** argv))";
 
    char buf[MAXN], string[ROWS][LENG];
    fp = fopen(fname, "rt");
    fc = fopen(fmain, "wt+");
    while (fgets(buf, MAXN, fp) != NULL) {
        if ((strstr(buf, find1) != NULL) || (strstr(buf, find2) != NULL)) {             
                if (buf == "{") {
                    count1++;
                }
                if (buf == "}") {
                    count2++;
                }
                while (count1 != count2) {
                    for (int і = 0; buf[і] != '\0'; і++)                    
                         string[n][i] = buf[i];
                }
           
        fputs(string[n], fc);
        n++;
        }
    }
    fclose(fp);
    fclose(fc);
    fc = fopen(fmain, "rt+");
    while (fgets(buf, ROWS, fc) != NULL)
        fputs(buf, stdout);
    fclose(fc);
    return 0;
}
У меня в файле program4lab7.cpp тот же код, что тут.

Возможно где-то и не досмотрела, но никак не пойму(
Кот__ вне форума Ответить с цитированием
Старый 27.04.2022, 13:31   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
int main(void)
а вы ищите
Код:
find1 = "int main()"
или
Код:
find2 = "int main(int argc, char** argv))"
Если в тестовом файле все тоже самое, то ваш код находит строку, но не начало функции.
Еще отличительные особенности main.
* int main находится сразу после начала новой строки (перед ними разве что могут быть символы пробелов или табуляции).
* С круглыми скобочками можно поступить так же как с фигурными, чтобы не искать различный набор аргументов.
* Фигурные скобочки могут быть внутри комментария или строки, тогда их учитывать не надо. Из-за этого баланс скобок может не сходиться.

Код:
char *strstr(const char *, const char *);
Эта функция возвращает указатель на начало искомой строки. Вы его просто проверяете на !=NULL но не сохраняете.

Последний раз редактировалось macomics; 27.04.2022 в 13:38.
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переписать программу из одного языка в другой Arishari Помощь студентам 22 13.06.2015 11:54
Переписать числа из одного файла в другой, чередуя отрицательные и положительные (Паскаль) Dekker11 Помощь студентам 7 17.12.2014 14:45
переписать из одного массива в другой devс++ cas2010 Помощь студентам 0 21.10.2012 12:11
Переписать елементы из одного массива в другой allegri Помощь студентам 3 03.01.2011 18:57