Removing substring from a string?

后端 未结 4 1304
予麋鹿
予麋鹿 2020-12-06 11:08

I have a C function, which takes a string called \'buffer\', and parses it, it will match keywords and use that to assign values in a structure.

However, some keywor

相关标签:
4条回答
  • 2020-12-06 11:40

    have a look at a simple ANSI C solution like:

    void removeSubstring(char *s,const char *toremove)
    {
      while( s=strstr(s,toremove) )
        memmove(s,s+strlen(toremove),1+strlen(s+strlen(toremove)));
    }
    
    0 讨论(0)
  • 2020-12-06 11:50

    Have a look at the methods in string.h.

    Example: (and on CodePad)

    #include <string.h>
    #include <stdio.h>
    #include <stddef.h>
    
    int main()
    {
        const char * source = "FN;CHARSET=UTF-8:David Celery";
        const char * newBegin = strrchr(source, ':');
        if (!newBegin)
        {
            puts("Error!");
            return -1;
        }
        newBegin++;
        puts(newBegin);
        return 0;
    }
    
    0 讨论(0)
  • 2020-12-06 11:53

    Someone else has a C string find and replace function that you might find useful here.

    edit: included code snippet from link below, as per comment request

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    /*
     * Description:
     *   Find and replace text within a string.
     *
     * Parameters:
     *   src  (in) - pointer to source string
     *   from (in) - pointer to search text
     *   to   (in) - pointer to replacement text
     *
     * Returns:
     *   Returns a pointer to dynamically-allocated memory containing string
     *   with occurences of the text pointed to by 'from' replaced by with the
     *   text pointed to by 'to'.
     */
    char *replace(const char *src, const char *from, const char *to)
    {
       /*
        * Find out the lengths of the source string, text to replace, and
        * the replacement text.
        */
       size_t size    = strlen(src) + 1;
       size_t fromlen = strlen(from);
       size_t tolen   = strlen(to);
       /*
        * Allocate the first chunk with enough for the original string.
        */
       char *value = malloc(size);
       /*
        * We need to return 'value', so let's make a copy to mess around with.
        */
       char *dst = value;
       /*
        * Before we begin, let's see if malloc was successful.
        */
       if ( value != NULL )
       {
          /*
           * Loop until no matches are found.
           */
          for ( ;; )
          {
             /*
              * Try to find the search text.
              */
             const char *match = strstr(src, from);
             if ( match != NULL )
             {
                /*
                 * Found search text at location 'match'. :)
                 * Find out how many characters to copy up to the 'match'.
                 */
                size_t count = match - src;
                /*
                 * We are going to realloc, and for that we will need a
                 * temporary pointer for safe usage.
                 */
                char *temp;
                /*
                 * Calculate the total size the string will be after the
                 * replacement is performed.
                 */
                size += tolen - fromlen;
                /*
                 * Attempt to realloc memory for the new size.
                 */
                temp = realloc(value, size);
                if ( temp == NULL )
                {
                   /*
                    * Attempt to realloc failed. Free the previously malloc'd
                    * memory and return with our tail between our legs. :(
                    */
                   free(value);
                   return NULL;
                }
                /*
                 * The call to realloc was successful. :) But we'll want to
                 * return 'value' eventually, so let's point it to the memory
                 * that we are now working with. And let's not forget to point
                 * to the right location in the destination as well.
                 */
                dst = temp + (dst - value);
                value = temp;
                /*
                 * Copy from the source to the point where we matched. Then
                 * move the source pointer ahead by the amount we copied. And
                 * move the destination pointer ahead by the same amount.
                 */
                memmove(dst, src, count);
                src += count;
                dst += count;
                /*
                 * Now copy in the replacement text 'to' at the position of
                 * the match. Adjust the source pointer by the text we replaced.
                 * Adjust the destination pointer by the amount of replacement
                 * text.
                 */
                memmove(dst, to, tolen);
                src += fromlen;
                dst += tolen;
             }
             else /* No match found. */
             {
                /*
                 * Copy any remaining part of the string. This includes the null
                 * termination character.
                 */
                strcpy(dst, src);
                break;
             }
          }
       }
       return value;
    }
    void test(const char *source, const char *search, const char *repl)
    {
       char *after;
       after = replace(source, search, repl);
       printf("\nsearch = \"%s\", repl = \"%s\"\n", search, repl);
       if ( after != NULL )
       {
          printf("after  = \"%s\"\n", after);
          free(after);
       }
    }
    int main(void)
    {
       const char before[] = "the rain in Spain falls mainly on the plain";
       printf("before = \"%s\"\n", before);
       test(before, "the", "THEE");
       test(before, "the", "A");
       test(before, "cat", "DOG");
       test(before, "plain", "PLANE");
       test(before, "ain", "AINLY");
       return 0;
    }
    /* my output
    before = "the rain in Spain falls mainly on the plain"
    search = "the", repl = "THEE"
    after  = "THEE rain in Spain falls mainly on THEE plain"
    search = "the", repl = "A"
    after  = "A rain in Spain falls mainly on A plain"
    search = "cat", repl = "DOG"
    after  = "the rain in Spain falls mainly on the plain"
    search = "plain", repl = "PLANE"
    after  = "the rain in Spain falls mainly on the PLANE"
    search = "ain", repl = "AINLY"
    after  = "the rAINLY in SpAINLY falls mAINLYly on the plAINLY"
    */
    

    Hope this helps.

    0 讨论(0)
  • 2020-12-06 11:53

    Instead of removing them, you could just ignore them, for example like this:

    #define KEY_TO_IGNORE "CHARSET=UTF-8"
    
    char key[80];
    char value[80];
    char *text = "FN;CHARSET=UTF-8:David Celery";
    
    sscanf(text, "%2s;" KEY_TO_IGNORE ":%s", key, value);
    
    printf("key: %s, value: %s\n", key, value);
    
    0 讨论(0)
提交回复
热议问题