Today
Total
Recent Posts
Link
반응형
«   2025/04   »
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
Archives
관리 메뉴

아임'준

[C언어] strcpy / strncpy 본문

[C]/[C : 개념]

[C언어] strcpy / strncpy

아임'준 2021. 3. 4. 10:00
반응형

*해당 글에 있는 코드들은 모두 복사해서 사용할 수 있게끔 만들어두었습니다. 주석만 보고 이해하려고 하지 말고 코드를 복사해서 직접 실행하며 그 결과를 통해 이해하고자 하면 더 도움이 될것입니다. 물론 그냥 복사 붙여넣기 하는 것보다 본인이 직접 코드를 타이핑하는 것이 이해와 후에 사용할 때에 더 큰 도움이 될 것이니 이 점 명심하고 공부해주시기 바랍니다.

 

strcpy / strncpy : <string.h>

strcpy / strncpy는 생김새에서 알 수 있듯이 둘이 비슷한 기능을 한다.

우선 strcpy와 strncpysms string.h 헤더파일에 들어가 있기 때문에 #include <string.h>를 해줘야 한다.

strcpy는 string copy / strncpy는 string n copy라고 외우면 된다.

기능 및 사용 방법은 아래와 같다.

//strcpy
strcpy(a,b); //문자열 a에 문자열 b를 복사해서 저장

//strncpy
strcpy(a,b,n); //문자열 a에 문자열 b를 n만큼만 복사하여 저장

strcpy와 strncpy 둘 다 a,b 자리에는 문자열이 들어가야 한다. 문자열의 경우 배열로 선언된 문자열이나 포인터로 선언된 문자열이나 상관 없다. strncpy의 경우 n은 정수가 들어가 한다. 둘 다 두번쨰 문자열 인자를 첫번째 문자열에 복사하여 저장해주는 기능을 한다.

 

strcpy와 strcnpy가 중요한 이유는 문자열을 선언했을 때 선언과 동시에 초기화를 하지 않으면 후에 값을 그냥 =을 통해 대입할 수 없기 때문이다. 그렇기 때문에 우리는 strcpy를 통해 입력받은 문자열을 우리가 선언한 문자열에 복사해서 저장하는 방식으로 값들을 관리할 수 있다. 배열, 구조체 등에서 아주 중요하다.

 

strcpy 사용 예시이다.

#include <stdio.h>
#include <string.h>

int main(){
    
    char a[]="Hello";
    char *b;

    strcpy(b,a);
    
    printf("%s",b);
    
}

 

 

strncpy 사용 예시이다.

#include <stdio.h>
#include <string.h>

int main(){
    
    char a[]="Hello";
    char *b;
    
    strncpy(b,a,3);
    
    printf("%s",b);
    
}

 

 

strncpy(b,a,3); 이라고 입력했으니 Hello의 3번째인 Hel까지만 복사된 것이다. strcpy(b,a,strlen(a)); 혹은 strcpy(b,a,sizeof(a)-1)와 같이도 사용할 수 있다.

 

다음 예시를 보자.

#include <stdio.h>
#include <string.h>

int main(){
    
    char a[] = "Hello";
    char b[] = "HelloTest";
    
    strcpy(b,a);
    
    printf("%s",b);
    
}

위 코드를 실행하면 b가 a보다 4글자 길었음에도 불구하고 a를 b에 복사해서 넣으면 Hello가 출력된다. 이는 strcpy 함수가 '\0'까지 복사하기 때문이다(문자열의 끝에는 NULL이 존재). 그 때문에 뒤에 "Test"가 나오지 않고 "Hello"만 나오는 것이다.

#include <stdio.h>
#include <string.h>

int main(){
    
    char a[] = "Hello";
    char b[] = "HelloTest";
    
    strncpy(b,a,strlen(a));
    
    printf("%s",b);
    
}

위의 코드와 다른 점은 strcpy가 아니라 strncpy로 바뀌었으며 strlen(a)까지 복사하게 만들었다는 것이다. strncpy는 '\0'을 신경쓰지 않고 복사하라고 지정한 길이까지만을 복사한다. 그러므로 아래 코드는 실행할 시 "HelloTest"에 앞부터 "Hello"가 복사돼어 다시 "HelloTest"가 출력될 것이다.

 

이번에는 strlen이 아닌 sizeof(a)를 사용하여 할 것이다. strlen은 문자열의 글자수를 알려주지만 sizeof는 '\0'까지 포함한 현재 변수가 차지하는 공간을 알려주기 때문에 차이가 난다. 그러므로 아래와 같이 코드를 실행할 경우

#include <stdio.h>
#include <string.h>

int main(){
    
    char a[] = "Hello";
    char b[] = "HelloTest";
    
    strncpy(b,a,sizeof(a));
    
    printf("%s",b);
    
}

'\0'까지 복사되어 이번에는 "Hello"만 출력될 것이다. strlen과 같은 결과가 나오는 것을 원한다면 sizeof(a)-1과 같이 입력할 수 있다.

 

질문, 오타 지적, 오류 지적 등은 댓글로 환영합니다.

 

 

'[C] > [C : 개념]' 카테고리의 다른 글

[C언어] strlen  (0) 2021.03.03
[C언어] getchar / putchar  (0) 2021.02.15
[C언어] 파일 입출력  (0) 2021.02.15
[C언어 기초] 구조체  (0) 2021.02.10
[C언어 기초] 함수  (0) 2021.01.28
Comments