자료구조(data structure)

권오흠 자료구조 2강 (문자열)

이거시원조랑께 2023. 8. 11. 10:10
반응형

c에서의 3가지 문자열 타입

c에서 문자열 끝에는 \0 이라는 끝을 표시하는 null charater을 넣어줘야 한다

하나하나 넣기에는 불편하므로 c 에서는 편리한 기능을 제공하는데 이는 str[] = 'abcde'와 같이 선언할 경우 자동으로 문자갯수 + 1 개 크기의 문자열 배열을 만들어준다

str[] 변수는 만들어진 공간의 첫 주소를 가리키는 포인터 변수(주소 변경 불가)라고 말한 적이 있었는데 *str도 마찬가지로 주소를 가질 수 있는 포인터(주소 변경 가능)이다

str[] = 'abc' 와 *str = 'abc' 의 차이점은

str[]로 선언할 경우 str[1] = 'c' 와 같이 문자의 변경이 가능하지만 *str로 선언할 경우 문자의 변경이 불가능 하고 이를 string literal 이라고 부른다

이것은 c에서 나타나는 '특이한' 것이기 때문에 암기할 수 밖에 없다

 

\0을 표기 안해줄 경우

보이는 것 처럼 c 에서 \0을 통해 문자열의 끝을 알려주지 않으면 이상한 문자가 출력된다

 

문자열을 담는 배열

위와 같은 경우에 words를 어떻게 선언해야 할까?

그 답은 char * words[100]이다 (100은 임의의 숫자로 의미가 없다)

먼저 각각의 words 칸들이 가져야 할 값은 문자열 배열들의 첫 주소이다, 즉 포인터 배열이어야 한다는 것이다

그리고 우리가 포인터를 선언할때 앞에 적는 타입(int,char etc...)은 그 포인터가 가리키는 주소의 값의 타입을 의미한다는걸 기억하면 여기서 포인터가 가리키는 문자열 배열의 첫 주소의 값은 문자이기 때문에 char으로 선언해야 한다는 것이다

 

그리고 이때 문자열을 받아서 각각의 포인터에 담으려면 문자열을 복사해서(새로운 배열에 담아서) 이 주소를 넘겨줘야 한다

이를 쉽게 하기 위해서 strdup 이라는 함수가 있는데 이 함수의 작동 원리를 자세히 보면 다음과 같다

즉 malloc을 통해 필요한 크기만큼 새롭게 할당을 해주고 할당한 공간에 문자열을 복사해주고 이 배열의 주소를 반환하는 함수인 것이다

이런 방식을 통해야만 문자열을 담은 포인터 배열 words를 구성할 수 있다

반응형