상세 컨텐츠

본문 제목

부스트코딩 뉴비챌린지 스터디 5주차 : 메모리와 문자열

IT/스터디

by J KIMS 2020. 9. 7. 17:19

본문

반응형

3) 문자열 

 

문자열을 저장하는 방법 중 하나는 char포인터를 사용하는 것이다. (char배열을 이용할 수도 있음)

char포인터를 사용해 문자열을 선언하는 방법은 다음과 같다.

 

 

아래 그림과 같이 문자열은 배열의 구조를 가지고 포인터 변수 str은 첫번째 배열의 주소를 가리킨다.

(포인터 변수는 주소를 담고 있다는 것을 기억하자)

 

 

주의할 점은 "cs50"이라는 문자열 자체도 문자열이 시작하는 주소를 가리킨다는 것이다. 이는 배열의 이름이 배열이 시작하는 주소를 가리키는 것과 같은 원리이다. 그래서 %p 변환자로 출력하면 위와 같이 주솟값이 나온다. str은 문자열의 주솟값을 담고있으니 당연히 주솟값을 출력한다.

 

여기서 포인터 변수 str이 어떻게 저장된 주소가리키는 변수의 값을 둘 다 출력할 수 있는지 의문스러울 것이다.

이건 나도 c언어를 한동안 안하면 깜빡 잊어버리곤 한다 😅

 

보통은 포인터 변수가 가리키는 값에 접근하기 위해서 포인터 연산자를 쓰는데 문자열의 경우에는 그럴 필요가 없다. printf 함수의 %s 변환 문자가 포인터 연산으로 문자열을 출력하기 때문이다. 

 

%s를 쓰면 포인터 연산으로 배열 값들을 순서대로 읽어들이고 널문자를 만나면 출력을 종료한다. 

 

또, 위에서 문자열은 배열의 구조를 가지고 있다고 했는데 이말은 즉슨 배열처럼 쓸 수 있다는 뜻이다.

 

위와 같이 코드를 작성해서 문자열을 한글자씩 출력하는 것도 가능하다. 이때 출력 변환은 %c로 지정한다.

 

 

4 ) 문자열 비교

 

※ string 타입과 get_string 함수는 문자열을 편리하게 입력받기 위해 cs50 라이브러리에서 정의된 것들이다.

 

위와 같이 문자열을 비교해서 비교하면 같은 문자열을 입력했는데도 different가 출력되는 걸 볼 수 있다.

 

입력한 문자열은 각기 메모리의 다른 곳에 저장된다

이는 우리가 입력한 문자열이 메모리의 각기 다른 영역에 저장되기 때문이다. 따라서 문자열의 시작 주소를 가리키는 s과 t를 비교하면 둘은 다르다고 판단한다.

 

그렇다면 두 문자열이 같은지 아닌지 비교하려면 어떻게 해야할까?

 

<string.h>에 정의된 strcmp함수를 쓰면 두 문자열을 비교하는 것이 가능하다.

strcmp(str1,str2)이라고 입력했을때 두 문자열이 같으면 함수는 0을 반환한다.

 

 

5) 문자열 복사

 

int main(void)
{
	char *s = get_string("s: ");
    
   	char *t = s;
}

만약 위와 같이 s에 문자열을 입력받고, s를 바로 t에 대입한다면 문자열이 복사되는 것이 아니라 문자열의 주소를 전달해주는 꼴이 된다. s는 문자열의 주소를 저장하기 때문이다.

 

 

이 경우 t와 s 모두 같은 문자열을 가리키고 있고, t를 수정한 후 s를 출력해도 수정된 값이 그대로 나온다. 이는 복사본을 만들기에 실패한 것이다.

 

문자열을 복사하기 위해서는 strcpy 를 사용해야한다. strcpy는 <string.h>에 정의되어있다.

strcpy(str1, str2) 는 문자열 str2를 str1에 복사한다.

반응형

관련글 더보기

댓글 영역