Есть много проблем с кодом:
Ваш код не отступом правильно. Я бы даже сказал, что это с отступом! Потратьте время и внимание на то, чтобы вы отпечатали свой код с 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
пустая строка, ваш код вызывает неопределенное поведение для этого особого случая. Также как насчет нескольких матчей? Вы должны удалить их все или только первое вхождение, как вы пытаетесь это сделать сейчас?
Не используйте 'gets', в первую очередь. – szczurcio
Вам нужно заглушить нулевой символ, чтобы прервать строку –
У вас есть 'sir [i] = '\ 0'', когда вы хотите поместить NULL в' sir [j] =' \ 0'', так как это новый end –