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 에 저장되어있는 값을 가리키도록 만 설정하는 부분이기 때문에 이상동작이 발생하게 된 것이다.
위와 같이 words[n] = buffer 와 같이 구현하게 되면 words 의 배열의 각 주소가 buffer 의 주소를 가리키게 되어 모든 값이 buffer 의 현재 저장되어있는 값을 출력하는 형태로 나타나게 된다.
최초 목적대로 구현하기 위해서는 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 |