문자열을 대입하는 strcpy 함수
문자열을 대입하려면 char 배열로 이루어진 문자열의 개채 하나하나에 접근해서 변경하는 작업을 수행해야 하므로 노가다가 필요합니다.
마지막에 널문자 까지 저장해야 문자열 대입이 완전히 끝나게 되는데 이를 간편하게 도와주는 함수가 바로 strcpy 되시겠습니다.
string copy의 약어 입니다. 문자열 복사라는 뜻이 있네요.
함수 사용법은 간단합니다.
strcpy(복사 받을곳, 복사할 내용)
예제를 통해 익혀 봅니다.
#include<stdio.h>
#include<string.h>
int main()
{
char str1[80] = "strawberry";
char str2[80] = "apple"; //char 배열로 문자열을 넣음
char* ps1 = "banana"; //char 포인터 변수에 문자열상수를 직접 넣음
char* ps2 = str2; //포인터 변수가 char배열을 참조하도록 함
printf("최초 문자열 : %s\n", str1);
strcpy(str1, str2);
printf("바뀐 문자열 : %s\n", str1);
strcpy(str1, ps1);
printf("바뀐 문자열 : %s\n", str1);
strcpy(str1, ps2);
printf("바뀐 문자열 : %s\n", str1);
strcpy(str1, "banana"); //직접 문자열 상수를 때려넣음
printf("바뀐 문자열 : %s\n", str1);
return 0;
}
실행 결과를 보고 알 수 있는 점은 두번째 인수로 사용되는 녀석은
1. 문자열 배열로 이루어진 변수를 넣거나
2. 포인터 변수로 문자열 상수를 받은 변수를 넣거나
3. 문자열 배열을 참조한 포인터를 넣거나
4. 마지막으로 직접 타이핑해서 적은 문자열 상수를 넣더라도 작동한다는 것이겠네요.
문자열로 취급할 수 있기만 하면 전부 작동합니다.
사용하면 안되는 경우는 아래와 같습니다.
strcpy("banana", "apple"); //문자열 상수를 바꾸고자함
strcpy(ps1, "apple") //ps1이 연결하고 있는 문자열 상수가 바뀜
이 두가지 모두 한가지 공식을 위반하고 있습니다.
상수는 변수와 반대로 변하지 않는 수라는 것이죠.
포인터 변수 ps1역시 "banana"라는 상수를 참조하고 있기에 상수를 변경하는 것은 에러가 발생합니다.
두가지 공식을 기억합시다.
첫번째 인수는 char 배열이나 배열명을 저장한 포인터를 사용할 수 있습니다. (문자열 상수는 불가능함)
두 번째 인수는 문자열의 시작 위치를 알 수 있다면 어떤 것이든 사용할 수 있습니다.
원하는 개수의 문자만을 복사할 수 있는 strncpy도 있다.
strncpy(복사받을 배열, 복사 할 배열, 복사할 문자 수)
위는 strncpy의 활용식입니다.
복사 받을 배열은 문자열 배열을 의미하고
복사할 배열은 어떤 배열을 복사하여 넣을 것인지를 의미합니다.
복사할 문자 수는 0을 포함한 자연수 숫자로 표기되며(0을 넣으면 아무것도 복사 되지 않음)
어디까지(몇글자 까지)복사 할 것인지를 의미합니다.
#include<stdio.h>
#include<string.h>
int main()
{
char str[15] = "mango tree"; //initialize array
for (int i = 0; i < 15; i++)
{
strncpy(str, "apple-phoneeeeeeeeeeeeeee", i);
printf("%s\n", str);
}
return 0;
}
여기서 복사할 문자 수는 기존 복사받을 배열의 글자 수를 초과할 수 없으며,
배열의 글자수와 완전히 같게 복사 하게 되면 NULL 값이 없어서 쓰레기 값이 출력됩니다.
이렇듯 strncpy는 끝에 null까지 복사하지는 않기 때문에 strcpy처럼 변경하려면 직접 끝자리에 NULL을 넣어주어야 합니다.
'C언어 자습 > 혼자공부하는 C언어 (저자 서현우)' 카테고리의 다른 글
문자열 연산함수(3) 문자열을 비교하는 strcmp, strncmp함수 (0) | 2023.04.21 |
---|---|
문자열 연산 함수(2) strcat, strncat, strlen (0) | 2023.04.20 |
gets 함수를 사용한 문자열 입력(gets, fgets) (0) | 2023.04.20 |
문자열의 마지막에 NULL이 존재하는 이유 (0) | 2023.04.20 |
문자열을 출력하는 puts, fputs 함수 (0) | 2023.04.20 |