删除C中字符串的特定部分

时间:2014-09-15 00:36:38

标签: c string

嘿伙计们我试图删除字符串的特定部分...具体当用户输入字符串时如果字符串是旧字符串的一部分我删除它...这是一个假设输入和预期输出: string:“/ hello / world / iamsleepy” 被删除:“/ world” 输出:“/ hello / iamsleepy”

我尝试使用strstr执行此操作,下面是我正在使用的代码...但它不起作用...让我知道我做错了什么......还是有其他方法可以解决此?

   char* string_delete(char* oldstr, char* str_to_remove){

      char* newstr = malloc(strlen(oldstr) - strlen(str_to_remove)+1);
      char* address = strstr(oldstr, str_to_remove);
       memcpy(newstr, oldstr, address - oldstr);
      memcpy(newstr + address - oldstr, address+strlen(str_to_remove), strlen(newstr)-    strlen(str_to_remove));
       return newstr;

      }

2 个答案:

答案 0 :(得分:0)

请尝试以下代码:

char* string_delete(char* oldstr, char* str_to_remove){
       char* address = strstr(oldstr, str_to_remove);
       if (NULL == address) {
            return NULL;    
      }
      int new_len = strlen(oldstr) - strlen(str_to_remove);
      char* newstr = (char *)malloc(new_len+1);

      memcpy(newstr, oldstr, address - oldstr);
      memcpy(newstr + (address - oldstr), address+strlen(str_to_remove), strstr(oldstr) - strlen(str_to_remove));
      newstr[new_len] = '\0';
      return newstr;
}

strlen(newstr)不正确,应为strlen(oldstr)。您需要在newstr的末尾添加'\ 0'。

编辑:以下函数将删除oldstr中的所有字符串str_to_remove,并将“a”返回给string_delete(“aaaa”,“aaa”)。但它的缺陷在于每次它都会将相同大小的oldstr内存分配给newstr,然后将其重新分配给真实内存。也许这不是很有效率。如果在调用此函数后不再关心oldstr,则可以返回已更改的oldstr,无需分配新内存。我希望它有所帮助。

char* string_delete(char* oldstr, char* str_to_remove){
    int len_to_remove = strlen(str_to_remove);
    int len_old = strlen(oldstr);

    char *newstr = (char *)malloc(len_old + 1);
    memcpy(newstr, oldstr, len_old + 1);

    char *pos = newstr;
    while ( ( pos = strstr(newstr, str_to_remove) ) != NULL ) {
        int cnt = strlen(pos + len_to_remove);
        memmove(pos, pos + len_to_remove, cnt + 1);
    }
    newstr = (char *)realloc(newstr, strlen(newstr) + 1);
    return newstr;
}

顺便说一句,如果我的英文快递不清楚或不对,请告诉我,我正在练习英语。 THX

答案 1 :(得分:0)

我在您的代码中看到以下问题。

  1. 未正确处理源字符串中未删除字符串的情况。

  2. 在它是空终止字符串之前使用strlen(newstr)会导致未定义的行为。

  3. 表达式newstr + address - oldstr不好,因为它是从左到右进行评估的。 newstr + address不是有效的表达式。您需要使用newstr + (address - oldstr)

  4. 返回的字符串不会以空值终止。

  5. 这是解决问题的函数版本。

    char* string_delete(char* oldstr, char* str_to_remove){
    
       size_t len_old = strlen(oldstr);
       size_t len_rem = strlen(str_to_remove);
       char* address = strstr(oldstr, str_to_remove);
       size_t len_new;
    
       char* newstr = NULL;
       if ( address == NULL )
       {
          newstr = malloc(len_old+1);
          strcpy(newstr, oldstr);
       }
       else
       {
          len_new = len_old-len_rem;
          newstr = malloc(len_new+1);
          memcpy(newstr, oldstr, address - oldstr);
          memcpy(newstr + (address - oldstr),
                 address + len_rem,
                 len_new - (address - oldstr) + 1);
       }
       return newstr;
    }