오늘 만들어 볼 것은 아래의 사진과 같습니다!
문자열을 입력하면 띄어쓰기로 구분해서 정수형 리스트에 저장하기!!
위에서는 수 입력을 5번 했지만 10번했다면 정수형 리스트의 크기는 10이 될 것입니다.
즉 사용자가 입력한 수의 개수를 프로그램에서 인식하고 그만큼 배열을 만든다고 생각하면 됩니다!
그럼 코드를 살펴 봅시다!!
(동적 배열과 구조체를 모르면 알아보신 후 글을 읽으시는 것을 추천합니다!)
#include <stdio.h> typedef struct list { int size; int * array; }list; int main(void) { char all[100] = ""; list* store = (list*)malloc(sizeof(list)); // 리스트 구조체 변수 생성 store->size = 1; store->array = (int)malloc(sizeof(int)*store->size); // 공간 만들기 printf("데이터 입력: "); gets(all); // 데이터 입력하기 char *box = NULL; box = strtok(all, " "); // 처음 값 가져온다 while (box != NULL) { store->array[store->size - 1] = atoi(box); // 배열에 넣는다 box = strtok(NULL, " "); // 새로운 값 가져온다 if (box != NULL) store->array = realloc(store->array, sizeof(int)*(++store->size)); // 값이 null이 아니면 공간 확장한다 } printf("리스트 출력: "); for (int i = 0; i < store->size; i++) { printf("%d ", store->array[i]); } printf("(size:%d)", store->size); }
typedef struct list {
int size;
int * array;
}list;
리스트 구조체를 만들어 봅시다. size는 배열에 들어가는 원소 개수, 즉 배열의 크기이고 array는 정수형 동적 배열을 가리킬 포인터입니다.
char all[100] = “”;
list* store = (list)malloc(sizeof(list)); // 리스트 구조체 변수 생성
store->size = 1;
store->array = (int)malloc(sizeof(int)store->size); // 공간 만들기
all 변수는 입력된 문자열이 저장될 변수입니다.
store은 리스트 구조체 변수로 앞으로 사용할 리스트의 포인터가 됩니다.
size는 초기이니 1로 초기화했고 동적배열도 정수가 한 개 들어갈 만큼 만들었습니다.
char *box = NULL; box = strtok(all, " "); while (box != NULL) { box = strtok(NULL, " ");
strtok함수를 모르는 분들을 위해 위 소스에 대해 살펴 보겠습니다.
strtok함수는 두 번째 인수안에 입력된 문자를 기준으로 문자열을 자르는 함수라고 생각하면 됩니다.
잘라진 문자열의 주소를 함수는 반환합니다.
ex) “1234 567″입력 후 strtok로 보냄 => “1234”문자형 배열의 주소를 반환
‘NULL이 첫 번째 인수로 들어가면 문자열을 어떻게 자르지?’ 라고 생각할 수 있습니다.
이 strtok함수는 자르고 남은 문자열을 계속 저장하고 있기 때문에, NULL을 줬다는 것은 아직 all배열에 대한 처리가 끝나지 않았다고 생각하면 됩니다.
ex) all=”1234 567 890″ => “1234”주소 반환, strtok함수는 “567 890″저장하고 있음 => “567”주소 반환, strtok함수는 “890”저장하고 있음 => “890”반환, strtok함수는 ‘\0’을 저장하고 있음
즉 위의 소스는 strtok가 null을 반환할 때까지 box에 문자열을 나누어서 저장하는 소스가 됩니다.
char *box = NULL; box = strtok(all, " "); // 처음 값 가져온다 while (box != NULL) { store->array[store->size - 1] = atoi(box); // 배열에 넣는다 box = strtok(NULL, " "); // 새로운 값 가져온다 if (box != NULL) store->array = realloc(store->array, sizeof(int)*(++store->size)); // 값이 null이 아니면 공간 확장한다 }
strtok함수를 이해했으면 위의 소스 이해는 쉬울 것이라 생각합니다.
strtok(all, ” “)를 해서 처음으로 잘라진 문자열 주소를 가져와서 box에 저장,
while문에서는
(배열에 저장 -> 새로운 값 가져오기 -> 값이 null이 아니면 공간 확장)을 반복합니다.
값이 null이면 공간 확장을 하지 않으니까, 입력한 수의 개수와 리스트 크기는 같아집니다!!
배열에 저장할 때는 정수형으로 저장하여야 하니 atoi함수를 이용하였습니다!
위와 같이 리스트에 차곡차곡 저장이 됩니다.
리스트 배열을 실수형으로 만들고 atof를 쓰면 실수도 저장할 수 있습니다.
< I use Korean to save time on lecture or explanation. If you need an explanation, please send an email or comments!! >