Я смотрю на строковые манипуляции в C, и я не понимаю, почему оператор s1[i] = s1[++i]; не заменит первый H на следующий символ e. Взгляните на код:
#include <stdio.h>
main()
{
  char s1[] = "Hello world !";
  for(int i = 0; s1[i] != '\0'; ++i)
    s1[i] = s1[++i];
  printf("%s", s1);
}
Он печатает Hello world ! вместо el r
