가끔씩 s1 -> s2 인지 s2 -> s1인지 헷갈릴 때가 있다..
필요한 헤더 : <string.h>
1
2
3
4
5
6
7
|
//! @brief s2의 문자열을 s1로 복사한다
char *strcpy( char *s1, const char *s2 );
//! @brief s2의 문자열을 count(문자갯수)만큼 s1로 복사한다
char *strncpy( char *s1, const char *s2, size_t count );
|
cs |
char *strncpy( char *s1, const char *s2, size_t count );
- dest에 대한 공간을 확인 하지 않기 때문에 버퍼오버런(buffer overruns) 방지하도록 유의
- s2에서 null 문자를 만나면, count개의 문자가 쓰여질때까지 s1에 null 문자가 추가된다.
번외편. lib을 만들거나 로우레벨 코딩을 할 때 가끔씩 memcpy 쓸때가 있다.
1
2
|
//! @breif s2의 문자열을 s1으로 n개 만큼 복사한다
void *memcpy(void *s1, const void *s2, size_t n);
|
cs |
그럼 strncpy 와 memcpy 가 하는 일은 같다. 호기심이 생기지 않는가. 직접 속도차이가 궁금하여 테스트 코드를 돌려보았는데 1000바이트의 문자열을 1억번 단순 복사 하는 프로그램이다. 수회 돌려 본 결과
결과는
아래는 짜본 테스트코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include "stdafx.h"
#include <string.h>
#include <time.h>
int main()
{
char s1[1024];
char s2[] =
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
;
time_t t1, t2 ,t3;
t1 = time(NULL);
for (int i = 0; i < 100000000; i++)
{
memcpy(s1, s2, sizeof(s2));
}
t2 = time(NULL);
for (int i = 0; i < 100000000; i++)
{
strncpy(s1, s2, sizeof(s2));
}
t3 = time(NULL);
printf("strcpy:%u, memcpy:%u\n", t2 - t1, t3 - t2);
getchar();
return 0;
}
|
cs |
strncpy vs memcpy 에 대해서 다음에 좀더 이야기를 해보도록 하겠습니다.
ps - 위 테스트 코드들에서는 변수 초기값을 할당 하지 않았지만 항상 초기값을 세팅하는 습관이 아주 중요하다고 입이 닳고 마르도록 얘기하고 싶습니다.
'까벨로퍼 > 개발 이야기' 카테고리의 다른 글
[Linux/Unix] Tcpdump(2) (0) | 2020.06.29 |
---|---|
[Linux/Unix] Tcpdump (0) | 2020.06.29 |
[Xcode] 단축키 모음 (0) | 2020.06.26 |
[c#] 프로그램에 아이콘 집어넣기 (0) | 2020.06.24 |
[Linux/Unix] iptables 설정 (0) | 2020.06.24 |