SHARE
TWEET

backup3

a guest Feb 22nd, 2020 69 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*3 лаба*/
  4.  
  5. ///возвращает одну, считанную с консоли, строку
  6. char *readLine(){
  7.     char *s = malloc(999);
  8.     s[0]='\0';
  9.     char mem;
  10.     scanf("%c",&mem);
  11.     for(int i=0;mem!='\n';i++){
  12.         s[i]=mem;
  13.         s[i+1]='\0';
  14.         scanf("%c",&mem);
  15.     }
  16.     return s;
  17. }
  18.  
  19.  
  20. /**Складывает две строки*/
  21. char* strPlus(char* s1,char* s2){
  22.     char* mass = NULL;
  23.     mass=(char*)realloc(mass,((lenStr(s1)+lenStr(s2)+1)*sizeof(char)));
  24.     int k=0;
  25.     for(int i=0;s1[i]!='\0';i++){
  26.         mass[k]=s1[i];
  27.         k++;
  28.     }
  29.     for(int i=0;s2[i]!='\0';i++){
  30.         mass[k]=s2[i];
  31.         k++;
  32.     }
  33.     mass[k]='\0';
  34.     return mass;
  35. }
  36.  
  37. /**длина строки*/
  38. int lenStr( char *str ){
  39.     int len=0;
  40.     for(int i=0;str[i]!='\0';i++)
  41.         len=i;
  42.     return len+1;
  43. }
  44.  
  45. /**ищет количество подстрок. (приложение к функции SearchPodstr)
  46. Нужна просто чтобы повысить читаемость кода.*/
  47. int kol(int* mass){
  48.     return mass[0];
  49. }
  50.  
  51. ///Важно. Первый элемент возвращаемого массива это количество элементов!!!
  52. int *SearchPodstr(char *s1/*строка*/,char *s2/*подстрока*/){
  53.     int* mass = NULL;
  54.     int len=0;
  55.     mass=(int*)realloc(mass,((len+1)*sizeof(int)));
  56.     mass[0]=len;
  57.     int memInd=0;/*запоминаем индекс с первым совпадением*/
  58.     int mem=0;/*Типо идём по подстроке*/
  59.     for(int i=0;s1[i]!='\0';i++){
  60.         if(s1[i] == s2[mem]){
  61.             if(mem==0){
  62.                 memInd=i;
  63.             }
  64.             if(s2[mem+1]=='\0'){
  65.                 len++;
  66.                 mass=(int*)realloc(mass,((len+1)*sizeof(int)));
  67.                 mass[0]=len;
  68.                 mass[len]=memInd;
  69.                 mem=0;
  70.                 memInd=0;
  71.             }else{
  72.                 mem++;
  73.             }
  74.         }else{
  75.             mem=0;
  76.             memInd=0;
  77.             if(s1[i] == s2[mem]){ //Если вдруг это несовпадение,
  78.                 if(mem==0){       //является началом новой подстроки
  79.                     memInd=i;
  80.                 }
  81.                 if(s2[mem+1]=='\0'){
  82.                     len++;
  83.                     mass=(int*)realloc(mass,((len+1)*sizeof(int)));
  84.                     mass[0]=len;
  85.                     mass[len]=memInd;
  86.                     mem=0;
  87.                     memInd=0;
  88.                 }else{
  89.                     mem++;
  90.                 }
  91.             }
  92.         }
  93.     }
  94.     return mass;
  95. }
  96.  
  97. /**2.1 возвращает строку между первым и вторым пробелом*/
  98. char* mezhduProbel(char *s){
  99.     int* podStr=SearchPodstr(s," ");
  100.     char* mass = NULL;
  101.     mass=(char*)realloc(mass,(sizeof(char)));
  102.     if(kol(podStr)>=2){
  103.         mass=(char*)realloc(mass,((podStr[2]-podStr[1])*sizeof(char)));
  104.         mass[podStr[2]-podStr[1]-1]='\0';
  105.         int k=0;
  106.         for(int i=podStr[1]+1;i<podStr[2];i++){
  107.             mass[k]=s[i]; k++;
  108.         }
  109.     }else{
  110.         mass[0]='\0';
  111.     }
  112.     return mass;
  113. }
  114.  
  115. /**2.2 Удаляет первую совпадающую подстроку*/
  116. char* firstDelPodStr(char* s1/*строка*/,char* s2/*подстрока*/){
  117.     int* podStr=SearchPodstr(s1,s2);
  118.     if(kol(podStr)>=1){
  119.         char* mass = NULL;
  120.         mass=(char*)realloc(mass,((lenStr(s1)-lenStr(s2)+1)*sizeof(char)));
  121.         mass[lenStr(s1)-lenStr(s2)]='\0';
  122.         int k=0;
  123.         for(int i=0;i<lenStr(s1);i++){
  124.             if ((i<podStr[1]) || (i>=podStr[1]+lenStr(s2))){
  125.                 mass[k]=s1[i];
  126.                 k++;
  127.             }
  128.         }
  129.         return mass;
  130.     }else{
  131.         return s1;
  132.     }
  133. }
  134.  
  135. /**2.3 Удаляет все подстроки из строки*/
  136. char* DelPodStr(char* s1/*строка*/,char* s2/*подстрока*/){
  137.     int* podStr=SearchPodstr(s1,s2);
  138.     if(kol(podStr)>=1){
  139.         char* sdo = NULL;/*Формируем строку до первого вхождения*/
  140.         sdo=(char*)realloc(sdo,((podStr[1]+1)*sizeof(char)));
  141.         sdo[podStr[1]]='\0';
  142.  
  143.         char* sposle = NULL;/*формируем строку после первого вхождения*/
  144.         sposle=(char*)realloc(sposle,((lenStr(s1)-lenStr(s2)-podStr[1]+1)*sizeof(char)));
  145.         sposle[lenStr(s1)-lenStr(s2)-podStr[1]]='\0';
  146.  
  147.         for(int i=0;i<podStr[1];i++){
  148.             sdo[i]=s1[i];
  149.         }
  150.         int k=0;
  151.         for(int i = podStr[1]+lenStr(s2);s1[i]!='\0';i++){
  152.             sposle[k]=s1[i];
  153.             k++;
  154.         }
  155.         /**Чтобы понять рекурсию, надо понять рекурсию*/
  156.         return strPlus(sdo,DelPodStr(sposle,s2));
  157.     }else{
  158.         return s1;
  159.     }
  160. }
  161.  
  162.  
  163.  
  164. int main()
  165. {
  166.     //char* s=readLine();
  167.     printf("%s\n",mezhduProbel("dfdsf 1fssdf1 fsdfs"));
  168.     printf("%s\n",firstDelPodStr("112323","123"));
  169.     printf("%s\n",DelPodStr("112323","123"));
  170.     //int* m=SearchPodstr("  "," ");
  171.     //printf("%d ",m[2]);
  172.     return 0;
  173. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top