ss = (char*)calloc(n, sizeof(char*)); // выделяем память под строку
Здесь Вы выделяете гораздо больше байт, чем Вам нужно,
sizeof(char*)
будет равен 8 на 64 битных архитектурах, когда
sizeof(char)
- 1. Но при этом стоит не забывать про место под
'\0'
в конце строки.
gets(ss);
printf("Введите свое слово (не забываем про длину строки): ");
scanf("%s", ss);
ss = (char*)realloc(i, sizeof(char*));
gets(ss);
Почитайте, что делает функция
gets
. Опять же проблема с размерами символа. Ну и у
realloc
несколько другая сигнатура. И вообще
realloc
достаточно недешевая операция, не за чем ее делать в цикле много раз над одним указателем, достаточно 1 раз в конце.
if (ss[i] != NULL) // проверка на нулевой указатель
Проверку на NULL нужно делать сразу после аллокации памяти. А вот в цикле ее делать незачем.
ss[j] = ss[j++];// здесь я заменял тот символ на следующий, тем самым перекидывая его в конец
Операция
j++
меняет
j
.
for (int i = 0; i < sizeof(ss); i++)// ну а тут пытался поменять размер
Операция
sizeof(ss)
даст размер
char*
, то есть размер указателя, что соответствует 8 на 64 битных архитектурах. Для вычисления длины строки (терминированной символом
'\0'
) есть функция
strlen
. А в данном случае вообще можно посчитать количество удаленных символов и из него вычислить длину результирующей строки, что будет дешевле.
Ну и по самому алгоритму. Все можно сделать за 1 проход, подсчетом удаляемых символов и перемещением текущего символа на количество удаленных символов назад.