Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- /*3 лаба*/
- ///возвращает одну, считанную с консоли, строку
- char *readLine(){
- char *s = malloc(999);
- s[0]='\0';
- char mem;
- scanf("%c",&mem);
- for(int i=0;mem!='\n';i++){
- s[i]=mem;
- s[i+1]='\0';
- scanf("%c",&mem);
- }
- return s;
- }
- /**Складывает две строки*/
- char* strPlus(char* s1,char* s2){
- char* mass = NULL;
- mass=(char*)realloc(mass,((lenStr(s1)+lenStr(s2)+1)*sizeof(char)));
- int k=0;
- for(int i=0;s1[i]!='\0';i++){
- mass[k]=s1[i];
- k++;
- }
- for(int i=0;s2[i]!='\0';i++){
- mass[k]=s2[i];
- k++;
- }
- mass[k]='\0';
- return mass;
- }
- /**длина строки*/
- int lenStr( char *str ){
- int len=0;
- for(int i=0;str[i]!='\0';i++)
- len=i;
- return len+1;
- }
- /**ищет количество подстрок. (приложение к функции SearchPodstr)
- Нужна просто чтобы повысить читаемость кода.*/
- int kol(int* mass){
- return mass[0];
- }
- ///Важно. Первый элемент возвращаемого массива это количество элементов!!!
- int *SearchPodstr(char *s1/*строка*/,char *s2/*подстрока*/){
- int* mass = NULL;
- int len=0;
- mass=(int*)realloc(mass,((len+1)*sizeof(int)));
- mass[0]=len;
- int memInd=0;/*запоминаем индекс с первым совпадением*/
- int mem=0;/*Типо идём по подстроке*/
- for(int i=0;s1[i]!='\0';i++){
- if(s1[i] == s2[mem]){
- if(mem==0){
- memInd=i;
- }
- if(s2[mem+1]=='\0'){
- len++;
- mass=(int*)realloc(mass,((len+1)*sizeof(int)));
- mass[0]=len;
- mass[len]=memInd;
- mem=0;
- memInd=0;
- }else{
- mem++;
- }
- }else{
- mem=0;
- memInd=0;
- if(s1[i] == s2[mem]){ //Если вдруг это несовпадение,
- if(mem==0){ //является началом новой подстроки
- memInd=i;
- }
- if(s2[mem+1]=='\0'){
- len++;
- mass=(int*)realloc(mass,((len+1)*sizeof(int)));
- mass[0]=len;
- mass[len]=memInd;
- mem=0;
- memInd=0;
- }else{
- mem++;
- }
- }
- }
- }
- return mass;
- }
- /**2.1 возвращает строку между первым и вторым пробелом*/
- char* mezhduProbel(char *s){
- int* podStr=SearchPodstr(s," ");
- char* mass = NULL;
- mass=(char*)realloc(mass,(sizeof(char)));
- if(kol(podStr)>=2){
- mass=(char*)realloc(mass,((podStr[2]-podStr[1])*sizeof(char)));
- mass[podStr[2]-podStr[1]-1]='\0';
- int k=0;
- for(int i=podStr[1]+1;i<podStr[2];i++){
- mass[k]=s[i]; k++;
- }
- }else{
- mass[0]='\0';
- }
- return mass;
- }
- /**2.2 Удаляет первую совпадающую подстроку*/
- char* firstDelPodStr(char* s1/*строка*/,char* s2/*подстрока*/){
- int* podStr=SearchPodstr(s1,s2);
- if(kol(podStr)>=1){
- char* mass = NULL;
- mass=(char*)realloc(mass,((lenStr(s1)-lenStr(s2)+1)*sizeof(char)));
- mass[lenStr(s1)-lenStr(s2)]='\0';
- int k=0;
- for(int i=0;i<lenStr(s1);i++){
- if ((i<podStr[1]) || (i>=podStr[1]+lenStr(s2))){
- mass[k]=s1[i];
- k++;
- }
- }
- return mass;
- }else{
- return s1;
- }
- }
- /**2.3 Удаляет все подстроки из строки*/
- char* DelPodStr(char* s1/*строка*/,char* s2/*подстрока*/){
- int* podStr=SearchPodstr(s1,s2);
- if(kol(podStr)>=1){
- char* sdo = NULL;/*Формируем строку до первого вхождения*/
- sdo=(char*)realloc(sdo,((podStr[1]+1)*sizeof(char)));
- sdo[podStr[1]]='\0';
- char* sposle = NULL;/*формируем строку после первого вхождения*/
- sposle=(char*)realloc(sposle,((lenStr(s1)-lenStr(s2)-podStr[1]+1)*sizeof(char)));
- sposle[lenStr(s1)-lenStr(s2)-podStr[1]]='\0';
- for(int i=0;i<podStr[1];i++){
- sdo[i]=s1[i];
- }
- int k=0;
- for(int i = podStr[1]+lenStr(s2);s1[i]!='\0';i++){
- sposle[k]=s1[i];
- k++;
- }
- /**Чтобы понять рекурсию, надо понять рекурсию*/
- return strPlus(sdo,DelPodStr(sposle,s2));
- }else{
- return s1;
- }
- }
- int main()
- {
- //char* s=readLine();
- printf("%s\n",mezhduProbel("dfdsf 1fssdf1 fsdfs"));
- printf("%s\n",firstDelPodStr("112323","123"));
- printf("%s\n",DelPodStr("112323","123"));
- //int* m=SearchPodstr(" "," ");
- //printf("%d ",m[2]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement