Как убрать подстроку из массива

Возникла проблема с функцией, она неправильно убирает подстроку из массива. Есть массив в котором лежат символы нужные для генерации пароля. Выглядит так:

char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789#$%&@*^~"

И есть функция remove_substr которая убирает подстроку, например 0123456789. Осуществляется перебор массива и подстроки. По условию пытаюсь распознать цифры и поставить вместо них нулевый байт

void remove_substr(char *substr)
{
  for (int j = 0; j < strlen(substr); j++) {
    for (int i = 0; i < strlen(alpha); i++) {
      if (substr[j] == alpha[i]) {
        alpha[i] = '\0';
      }
    }
  }
}

int main(void)
{
  remove_substr("0123456789");
  printf("%s\n", alpha);
  return 0;
}

После того как функция отработает вывод получается таким:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Цифры и специальные символы были убраны, а нужно было убрать только цифры. Как сделать так чтобы убирались только цифры? А специальные символы остались нетронутыми Заметил если поставить цифры после специальных символов в массиве alpha, то всё работает правильно

Еще я пытался писать так:

void remove_substr(char *substr)
{
 char *match = alpha;
 match = strstr(match, substr);
 *match = '\0';
 strcat(alpha, match);
}

Но здесь тоже убираются и цифры и специальные символы


Ответы (1 шт):

Автор решения: karaname

Получилось сделать с помощью memmove

char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789#$%&@*^~";
void remove_substr(char *substr)
{
  int len_alpha = strlen(alpha);
  int len_sub = strlen(substr);
  for (int i = 0; i < len_alpha; i++) {
    for (int j = 0; j < len_sub; j++) {
      if (alpha[i] == substr[j]) {
        memmove(&alpha[i], &alpha[i + 1], len_alpha - i);
      }
    }
  }
}

Помог этот вопрос

→ Ссылка