1. strcpy의 정의
strcpy는 string copy의 줄임말이다.
string은 문자열을 뜻하고 copy는 복사한다란 뜻이다.
여기서 문자열이 무엇인지 잠시 살펴보자면,
a같은 글자 하나를 c언어에선 문자라고 한다.
b라는 글자 하나또한 문자가 된다.
그럼 c도 문자고, d도 문자고, l도 문자일 것이다.
a와 b같은 문자 하나하나가 여러개 모여서 단어를 형성한 것을 문자열이라고 한다.
apple은 여러개의 문자, 즉 a와 p와 l과 e라는 문자가 모여서 만들어진 문자열이다.
banana도 여러개의 문자들이 모여서 만들어진 하나의 문자열이라고 할 수 있다.
결론: strcpy는 apple과 같은 문자열을 복사한다는 뜻이다.
그럼 여기서 의문이 드는게 왜 문자열을 복사하는
strcpy가 생겼을까하는 것이다. 이유는 생각보다 단순하다.
2. stycpy가 만들어진 이유
int a = 10;
a = 20;
위의 코드를 한 번 봐보자.
int a = 10;
를 해석하자면 a라는 이름을 가진 정수(int)를 담는 공간에
10이란 정수를 담았다는 뜻이다.
그런데 두 번째 줄에
a = 20;
이 있다.
해석해보자면
a라는 공간에 있는 10을 지워버리고 20을 채워넣으란 소리다.
이 상태로 a를 출력하면 10이 아닌 20이 출력될 것이다.
위의 코드가 이해가 됐다면 이제 아래의 코드를 봐보도록 하자.
char b[10] = "apple";
b = "banana";
char b[10] = "apple";
를 해석해보자면
b라는 문자(char)를 담는 공간에 apple이란 문자열을 채워넣겠단 뜻이다.
(문자열을 어떤 공간에 채워넣을 땐 char이라는 character의 줄임말을 사용한다.
참고로 character는 '글자'라는 뜻을 가지고 있다.)
b = "banana";
를 해석해보자면
b라는 공간에 있던 apple을 지워버리고
banana를 채워넣겠다고 한 것이다,
라고 해석하면 큰 일 나는 것이다.
바로 배열 때문이다.
배열은 똑같은 타입(int, char, float)의 자료형을
여러개 생성할 때 사용되는 것이다.
가령, 숫자 3개를 저장하려고 할 때
int a = 1
int b = 2
int c = 3
이렇게 하는 건 너무 시간이 오래 걸린다.
int a[3] = {1, 2, 3};
이렇게 배열을 사용하면
하나의 변수(a)만으로도 3개의 값을 저장할 수 있게 된다.
이제 본론으로 돌아와서
char b[10] = "apple";
를 자세히 보면 b옆에 [10]이 보일 것이다.
char b에 [10]이 붙음으로서 b라는 공간은 배열이 된다.
즉 b라는 공간이 총 10개로 늘어난 것이다.
이게 무슨 말이냐면
int a = 10;
을 그림으로 표현하자면 위와 같다.
즉 a라는 공간은 위의 그림처럼 한 덩어리 뿐이다.
그 덩어리 안에 10이란 정수(int) 들어가 있다.
하지만 char b[10] = "apple"; 는
배열, 즉 [10] 가 붙었고, 이는 b라는 공간을 10개 생성해!란 뜻이 된다.
만약 char b[5]였다면 b라는 공간을 5개 생성해란 뜻이 된다.
여기선 char b[10]이기 때문에
위의 그림 처럼 10개의 공간이 생성된다.
char b[10] = "apple";
는 b라는 공간 한 개 한 개에
a p p l e이 들어가게 해!란 뜻이 된다.
여기서부터 이제 문제가 발생한다.
배열로 선언된 곳에 들어간 값을 바꾸려면
배열을 이용해서 바꿔줘야 한다.
그러니까 apple을 banana로 바꾸고 싶다면
char b[10] = "apple";
b = "banana";
위의 코드처럼 바꿔주면 안된다.
위의 코드를 그림으로 표현하자면 이런 느낌이지 않을까 싶다.
비좁은 칸 한 개에 banana가 꾸깃꾸깃하게 들어간 것이다.
c언어에서 문자는 칸 한 개당 문자 한 개가 들어가야 한다.
그렇게 해주려면 아래 코드처럼 작성해줘야 한다.
char b[10] = "apple";
b[0] = 'b';
b[1] = 'a';
b[2] = 'n';
b[3] = 'a';
b[4] = 'n';
b[5] = 'a';
보기만 해도 번거롭고 시간도 오래 걸려 보이는 코드다.
지금 바꾸고자 하는 문자가 banana여서 이정도였지
만약에 banana처럼 짧은 단어가 아닌 긴 문장이라면?
생각하고 싶지도 않다.
이때 혜성처럼 등장한게 strcpy다.
3. strcpy 형식
strcpy는 문자열을 복사하는 아이라고 했었다.
이 strcpy를 사용하면 무슨 일이 벌어질까?
char b[10] = "apple";
b[0] = 'b';
b[1] = 'a';
b[2] = 'n';
b[3] = 'a';
b[4] = 'n';
b[5] = 'a';
이렇게 써야했던 코드를
char b[10] = "apple";
strcpy(b, "banana");
이렇게 쓰는 것만으로도 b에 있던 apple이란 문자열을 banana란 문자열로 바꿀 수 있다.
strcpy를 쓰는 방법은 아래와 같다.
strcpy(첫 번째, 두 번째);
여기서 첫 번째 부분에는 복사해서 붙여넣기 할 곳의 장소를 쓰고,
두 번째 부분에는 복사할 문자를 쓴다. 이게 무슨 소리인가 싶지만
아래 예시를 보면 금방 이해가 될 것이다.
우리는 banana란 문자를 복사해서 b라는 장소에 붙여넣기 하고 싶어했다.
여기서 복사할 문자는 banana가 된다.
즉 banana를 ctrl+c한 것이다.
ctrl+v할 곳의 장소는 b가 된다.
즉 복사해서 붙여넣기 할 곳의 장소는 b라고 할 수 있다.
이제
strcpy(b, "banana");
를 해석하자면
banana란 문자열을 복사해서
b라는 장소에 복사해줘가 된다.
그럼 strcpy가 '나만 믿어!' 라고 말하면서
b라는 공간 한 개 한 개에 banana라는 문자열을 넣어준다.
그럼 b라는 공간에 있던 apple은 사라지고
banana가 b라는 공간을 채우게 된다.
오늘은 이렇게 strcpy에 대해서 알아봤는데,
글이 조금이나마 도움이 되셨다면
하단의 공감(하트) 버튼을 클릭해주시면 감사하겠습니다!
공감은 글을 쓰는 데 큰 힘이 됩니다!
다음편 예고
개발 지식도 없이
개발 대회에 나갔는데 우수상을 탔다.
어떻게 이런 일이 가능했을까.
그 방법을 아래 글에 작성해봤다.
'BOX-IT > C++' 카테고리의 다른 글
[C++] (2) 파일 입출력 (0) | 2022.05.16 |
---|---|
[C++] 파일 개방과 입출력 (0) | 2022.05.16 |
[C++] ‘strcpy’ was not declared in this scope 해결방법 (0) | 2022.04.11 |
C언어에서 '100< X <200' 은 잘못된 표현이다. (0) | 2022.04.10 |
[C++] #include <stdio.h>는 뭐고, 왜 쓰는 걸까? (8) | 2022.04.04 |