Как убрать начальные / конечные пробелы в C без утечки памяти - PullRequest
1 голос
/ 20 мая 2019

предполагается, что некоторая строка (с начальными / конечными пробелами) имеет выделенную память.

void s_trim(char *str)
{
  char *end;
  while(isipace((unsigned char)* str)) str++; // trim leading
  end = str+strlen(str)-1;
  while(end>str && isspace((unsigned char)* end)) end--;
}

int main()
{
 char *test = (char*) malloc(12*sizeof(char));
 strcpy(test, "  abc def  "); // <2*spaces>+abc+<space>+def+<2*spaces>
 s_trim(test); // i'm going to use this to get "abc def" 
 free(test); // is this going to free all allocated memory [malloc(12*sizeof(char))] ?
}

1 Ответ

1 голос
/ 20 мая 2019

Ваша функция s_trim не вносит никаких изменений в массив str и также ничего не возвращает. Любые изменения в указателе str являются локальными для функции и не приводят к усечению входной строки.

Для обрезки вам необходимо иметь возвращаемое значение этой функции, которое даст измененный указатель.

char* s_trim(char *str)
{
  char *end;
  while(isspace((unsigned char)* str)) str++; // trim leading
  end = str+strlen(str)-1;
  while(end>str && isspace((unsigned char)* end)) end--;
  *(end +1) = '\0';
  return (str);
}

int main()
{
  char *test = (char*) malloc(12*sizeof(char));
  char * trimmed;
  strcpy(test, "  abc def  "); // <2*spaces>+abc+<space>+def+<2*spaces>
  trimmed = s_trim(test); // i'm going to use this to get "abc def" 
  printf ("Result = __%s__\n",trimmed);
  free(test); 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...