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
strcpy를 직접 짜면
10 / 17
const 올바른 사용법
☆ Star
↗ Full
strcat·strcmp 구현과 안전한 대안
#c
#string
#strcat
#strcmp
#embedded
@devpc
|
2026-05-04 12:40:01
|
GET /api/v1/flows/25/nodes/450?fv=1&nv=1
Context:
Flow v1
→
Node v1
0
Views
1
Calls
# strcat·strcmp 구현과 안전한 대안 ## strcat 직접 구현 `strcat`은 dst의 끝(기존 `\0` 위치)에 src를 이어붙인다. ```c char *my_strcat(char *dst, const char *src) { char *ret = dst; /* dst 끝으로 이동 */ while (*dst != '\0') dst++; /* src 복사 */ while ((*dst++ = *src++) != '\0'); return ret; } ``` dst 끝으로 이동하는 과정이 O(n)이므로 반복 호출 시 O(n²)가 된다. 대량 연결이 필요하면 포인터를 직접 추적해야 한다. --- ## strcat의 문제: 버퍼 오버플로 ```c char buf[8] = "Hello"; /* 5 + \0 = 6바이트 사용 */ strcat(buf, " World"); /* 6바이트 추가 필요, buf 오버플로 */ ``` `strcat`도 `strcpy`처럼 크기 확인 없이 덮어쓴다. ### strncat 사용 ```c char buf[32] = "Hello"; strncat(buf, " World", sizeof(buf) - strlen(buf) - 1); ``` 남은 공간을 `sizeof(buf) - strlen(buf) - 1`로 계산해서 넘긴다. 매번 `strlen`을 호출하는 비효율이 있다. --- ## strcmp 직접 구현 두 문자열을 비교해서 앞이 크면 양수, 같으면 0, 뒤가 크면 음수를 반환한다. ```c int my_strcmp(const char *a, const char *b) { while (*a && (*a == *b)) { a++; b++; } return (unsigned char)*a - (unsigned char)*b; } ``` `unsigned char`로 캐스팅하는 이유는 `char`가 signed일 때 음수 비교 오류를 막기 위해서다. ```c /* 사용 예 */ int r = strcmp("apple", "banana"); /* 음수: a < b */ if (strcmp(str1, str2) == 0) { /* 같음 */ } ``` --- ## strncmp: 길이 제한 비교 ```c /* 앞 n 문자만 비교 */ strncmp("Hello World", "Hello Korea", 5); /* 0: "Hello" == "Hello" */ ``` 프로토콜 헤더에서 prefix 비교나 키워드 매칭에 자주 쓰인다. --- ## snprintf: 가장 안전한 문자열 조합 복잡한 문자열 처리에는 strcat 대신 `snprintf`가 낫다. ```c char buf[64]; int id = 42; float val = 3.14f; /* 여러 값을 안전하게 조합 */ int written = snprintf(buf, sizeof(buf), "ID=%d, Val=%.2f", id, val); if (written >= (int)sizeof(buf)) { /* 잘림 발생 */ } ``` `snprintf`는 항상 `\0`으로 끝내고, 실제로 쓰려던 바이트 수를 반환하므로 잘림 여부를 확인할 수 있다. --- ## 요약 | 함수 | 문제 | 대안 | |------|------|------| | `strcat` | 오버플로 | `strncat` 또는 `snprintf` | | `strcmp` | 없음 | 그대로 사용 가능 | | `strncmp` | 없음 | 그대로 사용 가능 | | `sprintf` | 오버플로 | `snprintf` |
strcpy를 직접 짜면
const 올바른 사용법
// COMMENTS
Newest First
ON THIS PAGE
No content selected.