A cleaner way to remove a substring from str in C

I have the following line ID is a sample string remove to /0.10 , I would like to get the following: ID/0.10 .

Here is what I came up with. However, I am looking for a cleaner / better way to do this.

 #include <stdio.h> #include <string.h> int main () { char str[] = "ID is a sample string remove to /0.10"; char *a = strstr(str, "ID"); char *b = strrchr (str, '/'); if (a == NULL) return 0; if (b == NULL) return 0; int p1 = a-str+2; int p2 = b-str; int remL = p2 - p1; int until = (strlen(str) - p1 - remL) +1; memmove (str+p1, str+(p1+remL), until); printf ("%s\n",str); return 0; } 
+4
source share
2 answers

After defining a and b you can simplify memmove as follows:

 char str[] = "ID is a sample string remove to /0.10"; char *a = strstr(str, "ID"); char *b = strrchr (str, '/'); if ((a == NULL) || (b == NULL) || (b < a)) return 0; memmove(a+2, b, strlen(b)+1); 

The calculations you perform line by line are not really needed.

+3
source
 #include <stdio.h> #include <string.h> int main () { char str[] = "ID is a sample string remove to /0.10"; char *a = strstr(str, "ID"); char *b = strrchr (str, '/'); if (a == NULL || b == NULL) return 0; int dist = b - a; if (dist <= 0) return 0; // aware "/ ID" a += 2; while (*a ++ = *b ++); printf ("%s\n",str); return 0; } 

Or if you need a very dense version

  char str[] = "ID is a sample string remove to /0.10"; char *a = strstr(str, "ID"); char *b = strrchr (str, '/'); if (a == NULL || b < a) return 0; // no need to test b against NULL, implied with < a ++; while (*(++ a) = *b ++); 
+1
source

Source: https://habr.com/ru/post/1415826/


All Articles