2016-02-24 4 views
1

Я создал 2 функции, которые находят индекс подстроки и подставляют эту подстроку в строку. Я рад, что я присяжный фальсифицировал это, учитывая, что ранее заданные вопросы никогда не отвечали/не отмечались как закрытые без какой-либо помощи. Но любые предложения по более чистым методам?Эффективно заменить подстроку в строке

void destroy_substr(int index, int len) 
{ 
    int i; 

    for (i = index; i < len; i++) 
    { 
     string[i] = '~'; 
    } 
} 


void find_substr_index(char* substr) 
{ 
    int i; 
    int j; 
    int k; 
    int count; 
    int len = strlen(substr); 

    for (i = 0; i < strlen(string); i++) 
    { 
     if (string[i] == substr[0]) 
     { 
      for(j = i, k = 0; k < len; j++, k++) 
      { 
       if (string[j] == substr[k]) 
       { 
        count++; 
       } 
       if (count == len) 
        destroy_substr((j - len + 1), len); 
      } 
      j = 0; 
      k = 0; 
      count = 0; 
     } 
    } 
} 
+3

Любая причина для повторного изобретения 'strstr()'? –

+0

Я только использовал strstr() для возврата подстроки; Я не был уверен, как его реализовать, чтобы подстрока была заменена заданным символом. Как бы вы реализовали это с помощью strstr()? – rbecca

+0

(Грубо) Найдите первый индекс подстроки в строке. найдите длину подстроки. Удостоверьтесь, что у вас достаточно места в строке, если часть, которую вы заменяете, больше, чем это (возможно, потребуется учитывать это в объявлениях или malloc/realloc соответственно), удалите подстроку. Переместите остальную часть строки так, чтобы новая подстрока входила, а затем поместила новую. Прополощите и повторите при необходимости. – Magisch

ответ

2

Ваш код выглядит так, будто вы пытаетесь изобрести свое собственное колесо.

Используя стандартные функции C, которые являются strstr() и memset(), вы можете достичь того же результата, что и ожидалось.

#include <stdio.h> 
#include <string.h> 

char string[] = "foobar foobar foobar"; 
char substr[] = "foo"; 
char replace = '~'; 

int main() { 

    int substr_size = strlen(substr); 

    // make a copy to your `string` pointer 
    // this is to ensure we can safely modify this pointer value, without 'touching' the original one 
    char *ptr = string; 

    // while true (infinite loop) 
    while(1) { 

     // find pointer to next substring 
     ptr = strstr(ptr, substr); 

     // if no substring found, then break from loop 
     if(ptr == NULL) { break; } 

     // if found, then replace it with your char 
     memset(ptr, replace, substr_size); 

     // increment our string pointer, pass replaced substring 
     ptr += substr_size; 
    } 

    printf("%s\n", string); 

    return 0; 
} 
0

Как об этом:

#include <stdio.h> 
#include <string.h> 

int main(int argc, char **argv) 
{ 
    char string[] = "HELLO hello WORLD world HELLO hello ell"; 
    char substring[] = "ell"; 
    int stringLength = strlen(string); 
    int substringLength = strlen(substring); 

    printf("Before: %s\n", string); 

    if(substringLength <= stringLength) 
    { 
     int i; 
     int j; 

     for(i = 0, j = stringLength - substringLength + 1; i < j;) 
     { 
      if(memcmp(&string[i], substring, substringLength) == 0) 
      { 
       memset(&string[i], '~', substringLength); 
       i += substringLength; 
      } 
      else 
      { 
       i++; 
      } 
     } 
    } 

    printf("After: %s\n", string); 

    return 0; 
} 

Ключевые идеи:

  1. Вам нужно только сканировать строку (StringLength - substringLength) раз
  2. Вы можете использовать функции из строки .h для сравнения и замены подстроки
0

Вы можете скопировать новую строку на место. Если вы хотите поддерживать вставку более длинных строк, вам нужно будет управлять памятью с помощью malloc()/realloc(). Если вы хотите поддерживать вставку меньших строк, вам нужно будет продвинуть указатель на начало по длине строки замены, скопировать остальную часть строки в это новое место, а затем обнулить новый конец строки.

#include <stdio.h> 
#include <string.h> 
#include <err.h> 

int main(int argc, char **argv) 
{ 
    char *str = strdup("The fox jumps the dog\n"); 
    char *search = "fox"; 
    char *replace = "cat"; 
    size_t replace_len = strlen(replace); 
    char *begin = strstr(str, search); 

    if (begin == NULL) 
     errx(1, "substring not found"); 

    if (strlen(begin) < replace_len) 
     errx(1, "replacement too long"); 

    printf("%s", str); 
    memcpy(begin, replace, replace_len); 
    printf("%s", str); 

    return 0; 
} 
Смежные вопросы