앞/뒤에 공백문자를 안전하게 제거하려면 어떻게 하나요?


제가 생각해내는건 다 뻔한 코드라서 그런데 앞/뒤에 공백문자를 제거하는 정석이 있나요?

아주 정석적인 "보기 좋고, 안전한" 코드였으면 좋겠습니다.

  • 2016년 02월 02일에 작성됨

조회수 414


1 답변


좋아요
0
싫어요
채택취소하기

const문자열이 아니라면

/*
이 함수는 인자로 들어온 스트링의 부분 스트링을 가리키는 포인터를 return합니다.
인자로 들어온 str이 동적할당 된거면 메모리 누수가 있을 수 있으니 별도로 처리를 해주세요!
*/
char *trimwhitespace(char *str)
{
  char *end;

  // 앞의 공백제거
  while(isspace(*str)) str++;

  if(*str == 0)  // 스트링 전체가 공백문자면
    return str;

  // 뒤의 공백문자 제거
  end = str + strlen(str) - 1;
  while(end > str && isspace(*end)) end--;

  // 맨 뒤에 새로 null을 붙여줌
  *(end+1) = 0;

  return str;
}

const 문자열이라면

/*
output buffer에 결과를 저장하기 때문에 output buffer를 충분히 크게 잡아주세요.
크기가 너무 작으면 결과가 잘려서 나옵니다
*/
size_t trimwhitespace(char *out, size_t len, const char *str)
{
  if(len == 0)
    return 0;

  const char *end;
  size_t out_size;

  // 앞의 공백제거
  while(isspace(*str)) str++;

  if(*str == 0) // 스트링 전체가 공백문자면
  {
    *out = 0;
    return 1;
  }

  // 뒤의 공백문자 제거
  end = str + strlen(str) - 1;
  while(end > str && isspace(*end)) end--;
  end++;

  // output size의 크기를 정해줌
  out_size = (end - str) < len-1 ? (end - str) : len-1;

  // 결과를 복사하고 맨 뒤에 새로 null을 붙여줌
  memcpy(out, str, out_size);
  out[out_size] = 0;

  return out_size;
}
  • 2016년 02월 02일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close