Заменить директивы препроцессора #include на содержимое включаемого файла - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Вот текст задачи: Программа обрабатывает текст некой программы на C/C++ и заменяет директивы препроцессора #include на содержимое включаемого файла. Если включаемый файл не найден, директива остается без изменения. Текст поступает на стандартный ввод программы а результат выводится на стандартный вывод. У меня есть код программы, но я не понимаю, что происходит в данном цикле:
                                         while (i<strlen(s)) {
                        if (s[i]=='<') {
                            j=i+1;
                            while(s[j]!='>') {            
                                 *p1=s[j];    
                                  p1++;
                                  j++;
                            }
                            *p1='\0';
                            break;
                        }
К чему приходят эти манипуляции с переменными? Вот код:
#include <stdio.h>   
#include <string.h>     
#include <io.h> 
#include <stdlib.h>
#define M 80 
FILE *f;
int main() {       
    int i,j,p,c;    
    char s[M];
    while (fgets(s, M, stdin)) {
            char *p1=((char *) malloc(M*sizeof(char)));
            char *p2;
            if (!p1) {
                  printf("Error malloc");
                  exit(1);
            }
            p2=p1;
            p=0;
            if (strstr(s, "#include")) {                              
                  i=0; 
                p=1;
                  while (i<strlen(s)) {
                        if (s[i]=='<') {
                            j=i+1;
                            while(s[j]!='>') {            
                                 *p1=s[j];    
                                  p1++;
                                  j++;
                            }
                            *p1='\0';
                            break;
                        }
                        i++; 
                  }                 
           }
           if (p) { 
                  p1=p2;
                  if(!(f=fopen(p1,"r"))) printf("%s\n", s); else while ((c=getc(f))!=EOF) printf("%c", c);
           } else printf("%s\n", s);
           free(p1);          
    }     
    fclose(f);
    return 0;
}

Решение задачи: «Заменить директивы препроцессора #include на содержимое включаемого файла»

textual
Листинг программы
#include <stdio.h>
 
const char INC_PATH[] = "/usr/include/";
 
int main(void) {
    char buf[BUFSIZ], name[BUFSIZ], path[BUFSIZ];
    FILE * f;
    
    while ( fgets(buf, BUFSIZ, stdin) ) {
        if ( sscanf(buf, "#include <%[^>]>", name) == 1 ) {
            sprintf(path, "%s%s", INC_PATH, name);
            if ( f = fopen(path, "r") ) {
                while ( fgets(buf, BUFSIZ, f) )
                    printf("%s", buf);
                fclose(f);
            }
            else {
                fprintf(stderr, "WARNING! Can't open %s\n", path);
            }
        }
        else {
            printf("%s", buf);
        }
    }
    
    return 0;
}

Объяснение кода листинга программы

  1. Объявлены следующие переменные: — buf: буфер для чтения строки из стандартного ввода — name: буфер для хранения имени файла — path: буфер для хранения полного пути к файлу — f: указатель на файл
  2. Программа считывает строки с стандартного ввода до тех пор, пока не встретит строку, начинающуюся с #include.
  3. Если встречена строка, начинающаяся с #include, программа извлекает имя файла из этой строки и сохраняет его в переменной name.
  4. Затем программа формирует полный путь к файлу, добавляя к имени файла строку INC_PATH.
  5. Программа открывает файл по этому пути в режиме чтения и сохраняет указатель на файл в переменной f.
  6. Если файл открыть не удалось, программа выводит предупреждение в стандартный вывод ошибок.
  7. Если файл открыть удалось, программа считывает его построчно и выводит каждую строку на стандартный вывод.
  8. После окончания чтения файла программа закрывает его.
  9. Если файл открыть не удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  10. Если файл открыть удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  11. Если файл открыть не удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  12. Если файл открыть удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  13. Если файл открыть не удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  14. Если файл открыть удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  15. Если файл открыть не удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  16. Если файл открыть удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  17. Если файл открыть не удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  18. Если файл открыть удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  19. Если файл открыть не удалось, программа продолжает считывать строки со стандартного ввода и выводить их на стандартный вывод.
  20. Программа возвращает 0, чтобы указать, что она успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы