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

조회수 4174회

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

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

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;
    }
    

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.