가끔씩 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억번 단순 복사 하는 프로그램이다. 수회 돌려 본 결과 

결과는

평균적으로 strcpy가 2초, memcpy는 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

+ Recent posts