Advertisement
Guest User

backup3

a guest
Feb 22nd, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.18 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement