반응형


strlen

문자열의 길이를 반환합니다.

Declaration

size_t strlen( const char *str )

Return value

성공 - null 문자 이전까지의 문자 개수 반환
실패 - 없음


Parameters

str - 문자열의 주소


Detail descriptions

strlen()는 null 문자로 끝나는 문자열의 길이를 반환합니다. null 문자만 들어있는 빈 문자열("")이라면 길이는 1이 아니라 0이 됩니다. 0은 올바른 반환값이지 절대 에러를 가리키는 값이 아닙니다.

문자열 마지막에 있는 null 문자는 길이에 포함되지 않습니다. 가령, "hello" 문자열은 마지막에 있는 null 문자를 제외하므로 길이는 5가 됩니다. strlen()는 에러가 발생하지 않습니다. 어떠한 상황에서도 null 문자까지 나온 문자의 개수를 반환합니다. null 문자가 문자열 버퍼에 없다면 버퍼 영역을 지나 null 문자가 나올 때까지의 문자(쓰레기) 개수를 반환합니다.

    char str[32];
    printf( "길이 : %d", strlen(str) );


이 코드는 str에 null 문자가 들어있다고 장담할 수 없으므로 어떤 결과가 나올지 예측할 수 없습니다. 절대 에러를 반환하지 않기 때문에 조심해야 합니다.


Remarks

없음


Header files

<string.h>


Example codes

  1. strlen()를 사용해서 문자열을 거꾸로 뒤집어 봅니다. 표준은 아니지만, 같은 기능을 하는 함수로 VC++에는 _strrev()가 있습니다.
  2. StringReverse1()는 성능을 고려하지 않고 정직하게 작업한 함수이고, StringReverse2()는 포인터 연산을 써서 최적화시킨 함수입니다.
  3. 두 함수 모두 문자열 길이 전체가 아닌 1/2만큼 반복합니다. 매번 앞쪽과 뒤쪽에 있는 두 개의 문자를 교환하기 때문에 1/2만 반복합니다.
  4. 두 함수에서 공통으로 사용하기 위해, 문자를 교환하는 SwapChar()를 만듭니다.
  5. 두 함수를 같은 문자열에 대해 연속으로 적용했기 때문에 첫 번째는 뒤집혀서, 두 번째는 정상으로 나오는 것이 맞습니다. 출력 결과에 있는 내용은 잘못되지 않았습니다.

#include <stdio.h>
#include <string.h>

char* StringReverse1( char* str );
char* StringReverse2( char* str );
void SwapChar( char* p1, char* p2 );

void main()
{
    char str[32];

    printf( "문자열 : " );
    fgets( str, 32, stdin );

    str[strlen(str)-1] = '\0';

    printf( "거꾸로 : %s\n", StringReverse1(str) );
    printf( "거꾸로 : %s\n", StringReverse2(str) );
}

char* StringReverse1( char* str )
{
    size_t i, len = strlen( str );

    for( i = 0; i < len/2; i++ )
        SwapChar( &str[i], &str[len-i-1] );

    return str;
}

char* StringReverse2( char* str )
{
    char* front = str,
        * rear  = str + strlen(str) - 1;

    while( front < rear )
        SwapChar( front++, rear-- );

    return str;
}

void SwapChar( char* p1, char* p2 )
{
    char tmp;

    tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

[출력 결과]
문자열 : good morning
거꾸로 : gninrom doog
거꾸로 : good morning
 

반응형

'프로그래밍' 카테고리의 다른 글

제어문자  (0) 2008.04.25
strtok함수에 대해  (0) 2008.04.25
ssize_t, size_t 그리고 pid_t  (0) 2008.04.25
화살표(->) 연산자  (0) 2008.04.25
exit() 함수의 뜻  (0) 2008.04.25

+ Recent posts