Код корявый (делал на коленке и бегом), но почти все, как задано в условии. Только один массив для строки и есть проверки на старте программы (на единичность символа, на его отсутствие и тд - смотрите). Меняет и повторяющиеся участки тоже (без ограничений - только на размер buff). Код вроде работает как надо. Пользуйтесь.
/* ваши комменты */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 50
char buff[SIZE] = {0};
int main(int argc, char * argv[]){
int i, j, num1, num2;
char c = '.'; // искомый символ
char * str_ptr1;
char * str_ptr2;
puts("введите произвольную строку");
gets(buff);
str_ptr1 = strchr(buff, c);
str_ptr2 = strrchr(buff, c);
if (str_ptr1 == 0){
puts("искомого символа нет в строке");
exit(EXIT_FAILURE);
}
else if (str_ptr2 == 0 || str_ptr2 == str_ptr1){
fprintf(stdout, "%s", "Искомый символ единичен в строке");
exit(EXIT_FAILURE);
}
size_t len = strlen(buff);
i = 0;
while(buff[i] != '\0'){
if(buff[i] == c && buff[i+1] == c){
num1 = i + 1;
while(buff[i+1] == c){
++i;
num2 = i;
}
for(j = 0; j <= (len - num2 + 1); ++j){
buff[num1 + j] = buff[num2 + 1 + j];
}
}
++i;
}
puts("Итоговая строка имеет вид: ");
puts(buff);
exit(EXIT_SUCCESS);
}
/* в консоли:
введите произвольную строку
...abc...de
Итоговая строка имеет вид:
.abc.de
введите произвольную строку
ngt,,,
искомого символа нет в строке
*/