null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
C언어 실전 코드 패턴
Structure
struct
•
구조체 배열 선언과 초기화
•
구조체 포인터 접근하는 법
•
Swap 함수를 구조체에 적용하기
•
연결리스트 삽입·삭제·정렬
memory-pointer
•
malloc·free 사용 패턴
•
포인터로 Swap 구현하기
•
배열 복사 — memcpy vs 루프 비교
string-impl
•
strlen을 직접 짜면
•
strcpy를 직접 짜면
•
strcat·strcmp 구현과 안전한 대안
const-module
•
const 올바른 사용법
•
.h 파일과 .c 파일 역할 구분
•
파일 입출력 패턴
practical-tricks
•
가변길이 배열 파라미터 처리
•
!! 이중 부정 연산자
•
Windows 소켓 에러 모음
•
미니 프로젝트 — 영타 연습기 만들기
Flow Structure
배열 복사 — memcpy vs 루프 비교
8 / 17
strcpy를 직접 짜면
☆ Star
↗ Full
strlen을 직접 짜면
#c
#string
#strlen
#implementation
#embedded
@devpc
|
2026-05-04 12:40:00
|
GET /api/v1/flows/25/nodes/448?fv=1&nv=1
Context:
Flow v1
→
Node v1
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`으로 최대 길이를 제한해야 한다. 버퍼 오버리드 방지의 기본이다.
배열 복사 — memcpy vs 루프 비교
strcpy를 직접 짜면
// COMMENTS
Newest First
ON THIS PAGE
No content selected.