Ошибка в функции удаления пробелов в строке: удаляет больше чем нужно

Вот функция удаления пробелов в строке:

char *not_space(char *string){
char buf[16000];
char *str = NULL;
int index_buf = 0;
int mem_string = 0;
    for (int i = 0; i < my_len(string); i++){
        if (string[i] != ' '){
            for( int j = i; string[j] != ' '; j++ ){
                buf[index_buf] = string[j];
                index_buf++;
                mem_string++;
                i++;
            }
            buf[i] = '1';
            mem_string++;
        }
        if (i == my_len(string) -1 && buf[0] != ' ') {
            buf[index_buf] = '\0';
            mem_string--;
        }
    }
    buf[index_buf++] = '\0';
    str = calloc(mem_string, sizeof(char));
    my_strcopy(str, buf);
    return str;
}

Но функция не работает: она вообще удаляет все пробелы в строке, а если добавить printf во 2й цикл for тогда цикл движется 314 раз, и индексы изменяются до 314. Хотя во вводимой строке всего 11 символов (строка: got got got).


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

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

Если надо удалить все пробелы в начале и конце строки и оставить по одному между словами, вернув новую строку в динамической памяти, то можно написать какой-то такой код:

char *
not_space (char *string) 
{
  char *res = malloc(strlen(string) + 1); if (!res) return 0;

  size_t n = 0, n_spc = 0;
  for (size_t i = 0; string[i]; i++)
     if (string[i] != ' ')
        res[n++] = string[i], n_spc = 0;
     else if (!n_spc++)
        res[n++] = string[i];
     

  if (n && res[n - 1] == ' ')
     n--;
  res[n] = 0;

  return realloc(res, n + 1);
}


  
→ Ссылка