2015-05-30 3 views
0

Когда я запускаю эту программу, я представляю, например, строку Ana are mere и подстроку are. И приведенная строка - Ana mereere, а не Ana mere. Не могли бы вы рассказать мне, почему?Удаление подстроки из строки

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <string.h> 
char *str_rem(char *sir, char *subsir) 
{ 
    int i, j,k; 
    int loc = -1; //subsirul nu a fost gasit(presupunem) 
    for (i = 0; sir[i] && (loc==-1);i++) 
    for (j = i, k = 0; sir[j] == subsir[k];j++,k++) 
    if (subsir[k + 1] == 0) loc = i; 
    if (loc != -1) //subsirul a fost gasit 
    { 
     for (k = 0; subsir[k]; k++) 
      ; //bucla nu face nimic!! dorim sa obtinem cate elemente are subsirul 
     printf("\nSubsirul este format din %d elemente\n", k); 
     for (j = loc, i = loc + k; sir[i]; j++, i++) 
      sir[j] = sir[i]; 
     sir[i] = '\0'; 

    } 
    return (sir); 
} 
void main() 
{ 
    char *sir; 
    sir = (char*)malloc(255*sizeof(char)); 
    printf("Introduceti sirul: "); 
    gets(sir); 
    char *subsir; 
    subsir = (char*)malloc(255 * sizeof(char)); 
    printf("Introduceti subsirul care doriti sa fie cautat: "); 
    gets(subsir); 
    printf("Sirul %s rezultat dupa stergerea subsirului %s este: %s\n", sir, subsir, str_rem(sir, subsir)); 
    _getch(); 
} 
+2

Не используйте 'gets', в первую очередь. – szczurcio

+1

Вам нужно заглушить нулевой символ, чтобы прервать строку –

+2

У вас есть 'sir [i] = '\ 0'', когда вы хотите поместить NULL в' sir [j] =' \ 0'', так как это новый end –

ответ

3

Линия

sir[i] = '\0' 

должен быть

sir[j] = '\0' 
+1

Возможно, иметь лучшие имена переменных было бы хорошей идеей –

0

Есть много проблем с кодом:

Ваш код не отступом правильно. Я бы даже сказал, что это с отступом! Потратьте время и внимание на то, чтобы вы отпечатали свой код с 4 пробелами на уровне и использовали фигурные скобки для любого нетривиального блока, что предотвратит проникновение в него многих ошибок.

char *str_rem(char *sir, char *subsir) 
{ 
    int i, j, k; 

Используйте английский для своих комментариев, это поможет читателям из остального мира. Не все понимают румынский.

int loc = -1; //subsirul nu a fost gasit(presupunem) 

    for (i = 0; sir[i] && (loc == -1); i++) { 

Почему бы не использовать strstr() найти матч?

 for (j = i, k = 0; sir[j] == subsir[k]; j++, k++) { 
      if (subsir[k + 1] == 0) loc = i; 

Почему 2 отдельных теста? Условия эквивалентны.

  if (loc != -1) { //subsirul a fost gasit 

Зачем сканировать на '\0'? k += 1 было бы достаточно.

   for (k = 0; subsir[k]; k++) { 
        //bucla nu face nimic!! dorim sa obtinem cate elemente are subsirul 
        continue; // use this to emphasize the empty body. 
       } 

       printf("\nSubsirul este format din %d elemente\n", k); 
       for (j = loc, i = loc + k; sir[i]; j++, i++) { 
        sir[j] = sir[i]; 
       } 

Вот ошибка: Вы должны установить sir[j] вместо sir[i].

   sir[i] = '\0'; 

Еще одна ошибка здесь: учитывая, как написан ваш код, вы должны выйти из цикла здесь. Если вы исправите другую ошибку выше, цикл будет продолжать сравнивать за конец обеих строк.

  } 
     } 
    } 

Снимите (), return это утверждение, а не вызов функции.

return (sir); 
} 

Надлежащий прототип должен быть int main(void) или int main(int argc, char *argv[])

void main() 
{ 

Почему malloc вместо определения локального массива char sir[255];?

char *sir; 
    sir = (char*)malloc(255*sizeof(char)); 

    printf("Introduceti sirul: "); 

Никогда EVER использовать gets, используйте fgets(sir, 255, stdin); вместо этого, и проверить возвращаемое значение.И обирать '\n' с sir[strcspn(sir, "\n")] = '\0';

gets(sir); 

То же, что и выше: использовать char subsir[255];

char *subsir; 
    subsir = (char*)malloc(255 * sizeof(char)); 

    printf("Introduceti subsirul care doriti sa fie cautat: "); 

Использование fgets(subsir, 255, stdin) и subsir[strcspn(subsir, "\n")] = '\0';:

gets(subsir); 

Wrap длинные линии для читаемости:

Там это еще одна ошибка: вы изменяете sir до того, как она будет напечатана printf. Вы должны разделить эту строку на 2 отдельных вызова на printf, один с входными строками, один с результирующей строкой.

printf("Sirul %s rezultat dupa stergerea subsirului %s este: %s\n", 
      sir, subsir, str_rem(sir, subsir)); 

Наконец, этот вызов не является стандартным, используйте getchar() вместо этого.

_getch(); 
} 

Кроме того, вы должны проверить, если subsir пустая строка, ваш код вызывает неопределенное поведение для этого особого случая. Также как насчет нескольких матчей? Вы должны удалить их все или только первое вхождение, как вы пытаетесь это сделать сейчас?

Смежные вопросы