strcpy_s, strncpy_s 문자열 복사


strcpy_s, strncpy_s 문자열 복사


이번에는 문자열 복사함수 strcpy_s, strncpy_s에 대해서 알아보겠다.

strcpy_s, strncpy_s 함수는 string.h 헤더파일에 포함되어 있으니 헤더파일을 include 해줘야 한다.


1
2
3
4
5
6
int main()
{
    char arr[20];
 
    arr = "ABCD";
}
cs

이렇게 하면 오류가 난다. arr은 배열의 시작주소인데 시작주소에 문자열을 넣으니까 말이다
이 오류를 해결하기 위해 strcpy_s 함수가 있다.

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <string.h>
int main()
{
    char arr[20];
 
    strcpy_s(arr, sizeof(arr), "ABCD");
    printf("%s", arr);
}
cs

< 출력 >

ABCD

strcpy_s 사용법은 (복사할 배열, 사이즈, 넣어줄 값) 이라고 보면 된다.
이것을 구조체에서도 사용한다.

1
2
3
4
5
6
7
8
9
10
11
struct student
{
    char name[20];
};
int main()
{
    struct student s;
    s.name = "aossuper7";
 
    return 0;
}
cs

이렇게하면 8행에서 오류가 난다. 그 이유는 위에와 같이 시작 주소에 문자열을 넣었으니 말이다.
이것을 strcpy_s로 이용해서 에러를 없애보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
 
struct student
{
    char name[20];
};
int main()
{
    struct student s;
    strcpy_s(s.name, sizeof(s.name), "ABCD");
 
    printf("%s", s.name);
 
    return 0;
}
cs

< 출력 >

ABCD


구조체에 배열에 값을 넣을때는 이렇게 사용한다.
구조체 변수를 선언과 동시에 초기화 하지 않으면 이렇게 사용한다고 보면 된다.
strcpy_s 함수를 이용할라면 2번째 줄에 #include <string.h>를 추가해줘야 한다.
자 그럼 strncpy_s는 뭐냐?? 이 함수는 원하는 데이터만 복사해올수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
 
struct student
{
    char name[20];
};
int main()
{
    struct student s;
    strncpy_s(s.name, sizeof(s.name), "ABCDEFGHIJK"7);
 
    printf("%s", s.name);
 
    return 0;
}
cs

< 출력 >

ABCDEFG

strncpy_s 사용법은 (변수에 복사될 주소값, 변수에 저장할 갯수, 넣을 값의 주소값, 넣을값의 읽을 갯수); 라고 보면된다.
이렇게 우리가 원하는 데이터만큼 복사할수도 있다.


그럼 이제 strcpy 함수가 어떻게 동작하는지 함수의 원형을 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
void cpy(char *dest, const char *src)
{
    while (*src) {
        *dest = *src;
        src++;
        dest++;
    }
    *dest = '\0';
}
int main()
{
    char arr[20= "ABCDEFG";
    char arr1[20];
    cpy(arr1, arr);
    printf("%s", arr1);
 
    return 0;
}
cs


함수의 원형은 cpy 함수이다. 함수를 설명하자면
일단 dest에 복사될 주소값을 받아오고 src에 복사할 주소값을 받아온다.
그리고 int i = -1로 초기화를 해줬다. 그 이유는 src가 데이터 하나하나 복사를 해줘야 하니까 -1로 설정해줬다.
src[++i]가 널문자를 만날때까지 돌려라. i를 -1로 설정을 해줬으니 ++i를 하니까 0으로 변한다.
그리고 src 0번째 배열 값을 dest 0번째 값에 들어간다. 이거를 계속 반복해주면
ABCDEFG가 들어간다. 근데 반복문이 '\0'까지만 도니 '\0'은 복사가 안된다.
그래서 현재 i의 숫자 위치는 '\0'에 위치하고 있다 그래서 반복문이 끝나고 '\0'을 삽입해준다.
그리고 dest를 넘겨준다.

설명은 이러하다. 이게 strcpy_s의 함수 원형이다.



strncpy_s 함수를 구현해봤다. (그냥 나의 못난 실력으로 만들어보았다.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
void cpy(char *dest, size_t num, const char *src, size_t data)
{
    if (data > num)
        return;
    num = -1;
    while (++num < data)) {
        *dest = *src;
        src++;
        dest++;
    }
    *dest = '\0';
}
int main()
{
    char arr[20= "ABCDEFG";
    char arr1[20];
    cpy(arr1, sizeof(arr1), arr, 5);
    printf("%s", arr1);
 
    return 0;
}
cs


일단은 함수 _s 붙은것은 오버플로우 방지를 위해 붙은걸로 알고있다.
그래서 내가 복사할 데이터 사이즈가 복사될 변수의 사이즈보다 크면 함수를 끝내기로 했다.
그리고 num이 data보다 클때까지만 반복문이 돌아가게 해놨다.

그냥 이렇게 만들었다. 잘만든건지는 모르겠지만.. 이상 끝!!

댓글

Designed by JB FACTORY