Advertisement
Dalacul

Untitled

Dec 1st, 2019
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.80 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char* substring(char *string, int position, int lg)
  6. {
  7.     char *p;
  8.     int c;
  9.     p = (char*) malloc((lg + 1) * sizeof(char));
  10.     if(p == NULL)
  11.         return "";
  12.     for(c = 0; c < lg; ++c)
  13.         p[c] = *((string + position) + c);
  14.     p[c] = '\0';
  15.     return p;
  16. }
  17.  
  18. void insert_substring(char *a, char *b, int position)
  19. {
  20.     char *f, *e;
  21.     int lg;
  22.     lg = strlen(a);
  23.     f = substring(a, 0, position);
  24.     e = substring(a, position, lg - position + 1);
  25.     strcpy(a, "");
  26.     strcat(a, f);
  27.     free(f);
  28.     strcat(a, b);
  29.     strcat(a, e);
  30.     free(e);
  31. }
  32.  
  33. char* find_and_recolor(char* text, char* pattern)
  34. {
  35.     int lgpattern = strlen(pattern);
  36.     int lgreplace = lgpattern + 10;
  37.     int dif = 0;
  38.     char *p;
  39.     while((p = strstr(text + dif, pattern)))
  40.     {
  41.         dif = p - text;
  42.         //
  43.         insert_substring(text, "\e[0;31m", dif);
  44.         insert_substring(text, "\e[m", dif + lgpattern + 7);
  45.         //
  46.         p += lgreplace;
  47.         dif = p - text;
  48.     }
  49.     return strdup(text);
  50. }
  51.  
  52. char* read_line(char* pchar)
  53. {
  54.     char temp[200];
  55.     fgets(temp, 200, stdin);
  56.     int lg = strlen(temp) - 1;
  57.     temp[lg] = 0;
  58.     pchar = (char*)malloc(lg * sizeof(char));
  59.     strcpy(pchar, temp);
  60.     char *dup = strdup(pchar);
  61.     free(pchar);
  62.     return dup;
  63. }
  64.  
  65. int main()
  66. {
  67.     int n;
  68.     char pattern[30];
  69.     fgets(pattern, 200, stdin);                 //citim pattern
  70.     pattern[strlen(pattern) - 1] = 0;           //scoatem \n din finalul array-ului
  71.     scanf("%d\n", &n);                          //citim n
  72.     char **text = malloc(n * sizeof(char*));    //alocare dinamica pentru urmatoarele n linii
  73.     char *ex = malloc(n * sizeof(char));        //alocare dinamica pentru array exista.
  74.                                                 // ex poate sa fie char pentru ca ia doar valori 1/0
  75.     int i;
  76.     for(i = 0; i < n; ++i)                      //parcurgem n linii
  77.     {
  78.         text[i] = read_line(text[i]);           //citim si alocam spatiu pentru fiecare linie
  79.         if(strstr(text[i], pattern))            //daca am gasit macar o data pattern in linia curenta
  80.         {
  81.             find_and_recolor(text[i], pattern); //atunci gasim toate aparitiile lui pattern si inseram caracterele string-urile pentru culoare
  82.             ex[i] = 1;                          //marcam ca linia i contine pattern
  83.         }
  84.         else
  85.             ex[i] = 0;                          //marcam ca linia i nu contine pattern
  86.     }
  87.     for(i = 0; i < n; ++i)
  88.         if(ex[i])                               //daca exista pattern pe linia i
  89.             printf("%s\n", text[i]);            //atunci afisam
  90.     free(ex);                                   //eliberam memoria
  91.     free(text);
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement