null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
strlen을 직접 짜면
#c
#string
#strlen
#implementation
#embedded
@devpc
|
2026-05-04 12:40:00
|
GET /api/v1/nodes/448?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# strlen을 직접 짜면 ## 표준 strlen을 먼저 보자 ```c #include <string.h> size_t len = strlen("Hello"); /* 5 */ ``` `strlen`은 널 문자(`\0`)가 나올 때까지 문자 수를 세서 반환한다. **널 문자 자체는 포함하지 않는다.** --- ## 직접 구현 ```c size_t my_strlen(const char *s) { const char *p = s; while (*p != '\0') p++; return (size_t)(p - s); } ``` 포인터 차이로 길이를 계산한다. `*p`가 0(`\0`)이 되는 순간 루프가 끝난다. 다른 표현: ```c size_t my_strlen_v2(const char *s) { size_t len = 0; while (s[len] != '\0') len++; return len; } ``` 두 구현은 동일하다. 첫 번째가 더 관용적인 C 스타일이다. --- ## 왜 직접 구현을 해보는가 표준 함수는 쓰면 그만이지만, 직접 짜봐야 이해가 생긴다. 1. 포인터가 배열을 어떻게 순회하는지 2. `\0`이 실제로 종료 기준임을 체감 3. `const char *`로 받는 이유 (원본 수정 없이 읽기만) --- ## 함정: NULL 포인터 ```c /* strlen(NULL)은 정의되지 않은 동작 (UB) */ size_t len = strlen(NULL); /* 크래시 가능 */ /* 방어적 구현 */ size_t safe_strlen(const char *s) { if (!s) return 0; const char *p = s; while (*p) p++; return (size_t)(p - s); } ``` 임베디드에서 NULL 포인터로 strlen을 호출하면 하드폴트가 발생한다. --- ## 함정: 널 종료 없는 배열 ```c char buf[5] = {'H', 'e', 'l', 'l', 'o'}; /* 널 종료 없음 */ strlen(buf); /* UB: 메모리 범위 밖으로 탈출 */ /* 올바른 방법 */ char buf[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; /* 또는 */ char buf[6] = "Hello"; /* 자동으로 \0 추가 */ ``` C 문자열은 **항상 `\0`으로 끝나야 한다.** 이 규칙을 지키지 않으면 `strlen`, `strcpy`, `printf("%s")` 모두 버퍼 범위를 벗어난다. --- ## strnlen: 길이 제한 버전 ```c size_t strnlen(const char *s, size_t maxlen) { size_t len = 0; while (len < maxlen && s[len] != '\0') len++; return len; } ``` 임베디드에서 외부 입력을 받을 때는 `strnlen`으로 최대 길이를 제한해야 한다. 버퍼 오버리드 방지의 기본이다.
// COMMENTS
Newest First
ON THIS PAGE