본문 바로가기

자료구조

문자열 - 2

반응형

scanf 를 통해 문자열을 입력받을 때는 변수에 & 를 붙이지 않는다.

정수형의 경우 

 

scanf("%d", &변수명);

 

위와 같이 변수의 주소에 입력받은 값을 저장하기 위해 &를 사용하지만 문자열의 경우 배열에 저장되고,

배열의 이름이 배열의 주소를 가리키는 포인터 변수 그 자체이기 때문에 &를 사용하지 않는다.

 

문자열을 입력받아 저장하는 구조

 

위와 같이 words 라는 char 타입 포인터 변수를 생성한 뒤,

buffer 에 문자열을 입력받아 words에 저장하는 구조를 C언어로 구현하고자 한다.

 

//str2.c
#include <stdio.h>
#include <string.h>

int main() {

        char * words[100];
        int n = 0;
        int i = 0;
        char buffer[100];

        while (n<4 && scanf("%s", buffer) != EOF ) {
                words[n] = buffer;
                for(i=0; i<4; i++)
                        printf("word : %s\n", words[n]);
                n++;
        }

        for(i=0; i<4; i++)
                printf("%s\n", words[i]);

}
//str2 실행결과

구현하고자 하는 방식대로 동작했다면 위와같이 동작되는 것이 아니라

 

words[0] = abcd

words[1] = bcde

words[2] = ssde

words[3] = ffes 

 

의 형태로 출력이 되었어야하는데 실제로는 words의 모든 문자열이 마지막에 buffer 에 입력받은 문자열로 대체됨을 확인 할 수 있었다.

 

문제가 되는 부분은 소스의 내용중

 

words[n] = buffer;

 

부분이 문제가 되어 위와같이 이상동작이 발생하게 되었다.

words[n] = buffer; 부분은 words[n]의 주소값에 buffer의 주소값을 대체 하도록 하는 구문으로써,

실제로 words[n]에 문자열이 저장되는 값이 현재 buffer 에 저장되어있는 값을 가리키도록 만 설정하는 부분이기 때문에 이상동작이 발생하게 된 것이다.

 

1. scanf 를 통해 buffer 에 'abcd' 문자열 입력

 

2. words[0] -> buffer 를 가리키도록 설정함. (words[n] = buffer)
3. buffer 에 bcde 란 값을 입력
4. words[1] -> buffer 를 가리키도록 설정함. (words[n] = buffer)
5. buffer 에 ssde 란 값을 입력
6. words[2] -> buffer 를 가리키도록 설정함. (words[n] = buffer)

위와 같이 words[n] = buffer 와 같이 구현하게 되면 words 의 배열의 각 주소가 buffer 의 주소를 가리키게 되어 모든 값이 buffer 의 현재 저장되어있는 값을 출력하는 형태로 나타나게 된다.

 

최초 목적대로 구현하기 위해서는 strdup 함수를 통해 구현하여야 한다.

 

strdup 의 대략적인 구조

strdup 는 내부적으로는 위와 같이 구현된다.

매개변수로 받은 하나의 문자열을 strcpy 로 복제하여 반환하는 구조로 되어있다.

반응형

'자료구조' 카테고리의 다른 글

문자열 연습문제 -1  (2) 2022.11.17
문자열 - 3  (0) 2022.11.17
문자열 - 1  (0) 2022.11.17
배열, 포인터, 동적 메모리 - 3  (0) 2022.11.15
배열, 포인터, 동적 메모리 - 2  (0) 2022.11.15