• 검색 결과가 없습니다.

포인터 응용 2

N/A
N/A
Protected

Academic year: 2022

Share "포인터 응용 2"

Copied!
11
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

Intelligence Networking and Computing Lab.

포인터 응용 2

부산대학교 전기컴퓨터공학부

김종덕 ([email protected])

(2)

문제 1

❖ 아래 주어진 코드에서 문자열 배열 str[] = “1,Alan Turing,1912,1954”

을 Comma(“,”)를 기준으로 구분하여 Comma를 제외하고 각각을 한 줄로 출력하는 코드를 작성하라.

▪ 비슷한 작업을 pstr이 가리키는 문자열 “1,Alan Turing,1912,1954” 에 대해서도 수행하라.

▪ 새로운 지역 변수를 추가하여도 무방하다.

#include <stdio.h>

int main(void) {

char str[] ="1,Alan Turing,1912,1954";

char *pstr ="1,Alan Turing,1912,1954 ";

[ 1 ] return 0;

1

Alan Turing 1912

1954 1

Alan Turing 1912

1954

출력 결과

(3)

Intelligence Networking and Computing Lab.

문제 2

❖ 이전 문제와 같이 문자열 “1,Alan Turing,1912,1954”을 Comma(“,”)를 기준으 로 구분하는데 구분한 4개의 부분 문자열의 시작 주소를 Char * Array

ptoken에 저장하라. 또 모든 Comma는 ‘\0’으로 변경하도록 [1]에 적절한 코드를 작성하라. for loop에 의한 출력 결과는 아래와 같다.

3

#include <stdio.h>

int main(void) {

char str[] ="1,Alan Turing,1912,1954";

char *ptoken[4];

int i;

[ 1 ]

for (i=0; i < 4; i++) puts(ptoken[i]);

return 0;

}

1

Alan Turing 1912

1954

출력 결과

(4)

문제 3

❖ 문자열 “1,Alan Turing,1912,1954”을 Comma(“,”)를 기준으로 구분하 면 id, name, born-year, died-year를 의미한다.

▪ Died-year에서 born-year를 빼서 그 사람의 수명을 구하라.

▪ 문자열(char string)을 정수(int)로 바꾸는 C Standard Library를 함수를 사용하 라. <stdio.h>외에 다른 헤더 파일이 필요하면 추가하라.

#include <stdio.h>

int main(void) {

char str[] ="1,Alan Turing,1912,1954";

[ 1 ]

return 0;

} Alan Turing lived 42 years.

출력 결과

(5)

Intelligence Networking and Computing Lab.

문제 4-1

❖ 다음 코드는 Run Time Error가 발생한다. 이 코드의 Error 발생 지점을 확인 하고 그 이유를 설명해보라.

str[]과 *pstr은 어떻게 다른가?

str[]과 pstr은 메모리의 어떤 Segment에 존재하나? 1) Code, 2) Data, 3) Stack, 4) Heap

pstr이 가리키는 문자열 상수는 메모리의 어떤 Segment에 존재하나?

5

#include <stdio.h>

int main(void) {

char str[] = "1,Alan Turing,1912,1954";

char *pstr = "1,Alan Turing,1912,1954";

puts(str);

str[1]='\0';

puts(str);

puts(pstr);

pstr[1]='\0';

puts(pstr);

return 0;

}

(6)

문제 4-1

❖ 다음 코드는 Run Time Error가 발생한다. 이 코드의 Error 발생 지점을 확인 하고 그 이유를 설명해보라.

str[]과 *pstr은 어떻게 다른가?

str[]과 pstr은 메모리의 어떤 Segment에 존재하나? 1) Code, 2) Data, 3) Stack, 4) Heap

pstr이 가리키는 문자열 상수는 메모리의 어떤 Segment에 존재하나?

#include <stdio.h>

int main(void) {

char str[] = "1,Alan Turing,1912,1954";

char *pstr = "1,Alan Turing,1912,1954";

puts(str);

str[1]='\0';

puts(str);

puts(pstr);

pstr[1]='\0';

puts(pstr);

return 0;

(7)

문제 4-2

❖ 문제 4-1과 달리 문제 4-2의 코드 는 Run-Time Error가 발생하지 않 는다.

❖ 두 코드의 차이점을 비교하라.

❖ malloc에 의해 할당되는 메모리는 어떤 Segment에 존재하나?

❖ 어떤 메모리 공간은 임의로 변경 할 수 없다.

7

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int main(void) {

char str[] = "1,Alan Turing,1912,1954";

char *pstr = malloc(sizeof(str));

strcpy(pstr,str);

puts(str);

str[1]='\0';

puts(str);

puts(pstr);

pstr[1]='\0';

puts(pstr);

free(pstr);

return 0;

}

(8)

문제 5 – strtok() 함수의 이해

strtok

함수 설명을 먼저 확인하라.

▪ char *strtok( char *str, const char *delim );

Finds the next token in a null-terminated byte string

pointed to by str. The separator characters are identified by null-terminated byte string pointed to by delim.

This function is designed to be called multiples times to obtain successive tokens from the same string.

If str != NULL, the call is treated as the first call

If str == NULL, the call is treated as a subsequent calls/

This function is destructive: it writes the '\0' characters in the elements of the string str. In particular, a string literal cannot be used as the first argument of strtok.

Str[] 대신 char *pstr을 사용하면 어떻게 될까?

❖ Line 9부터의 str 및 token 내용 변화를 묘사하라.

#include <stdio.h>

#include <string.h>

int main(void) {

char str[] ="1,Alan Turing,1912,1954";

char *token = NULL;

puts(str);

token = strtok(str, ",");

puts(str);

while(token) { puts(token);

token = strtok(NULL, ",");

}

return 0;

}

1,Alan Turing,1912,1954 1

1

Alan Turing 1912

1954

출력 결과 12

34 56 78 109 1112 1314 1516 1718 19

, A l a n T u r i n g , 1 9 1 2

1 , 1 9 5 4 \

0 token

(9)

문제 6

❖ 문자열 “1,Alan Turing,1912,1954”

을 Comma(“,”)를 기준으로 구분하 여 구조체에 저장하려 한다.

구조체 MAN1과 MAN2의 차이를 구별 하라.

❖ 문제 5에서 다룬 strtok() 함수와 atoi() 등을 이용하여 m1, m2의 Field 값을 적절하게 설정하라.

❖ 출력 결과는 아래와 같다.

9

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

typedef struct man1 { int id;

int byear;

int dyear;

char name[64];

} MAN1;

typedef struct man2 { int id;

int byear;

int dyear;

char *pname;

} MAN2;

int main(void) {

char *pstr ="1,Alan Turing,1912,1954";

MAN1 m1;

MAN2 m2;

[ 1 ]

printf("%s was born in %d and died in %d.\n", m1.name, m1.byear, m1.dyear);

printf("%s was born in %d and died in %d.\n", m2.pname, m2.byear, m2.dyear);

return 0;

} Alan Turing was born in 1912 and died in 1954.

Alan Turing was born in 1912 and died in 1954.

출력 결과

(10)

Comma Separated Values

❖ 메모장을 이용하여 아래와 같이 작성하고 cpeople.csv로 저장하라.

확장자 csv에 유의하라.

csv는 Comma Separated Values를 의 미한다.

❖ 저장한 CSV 파일을 Excel에서 읽 어 보라.

(11)

Intelligence Networking and Computing Lab.

아래 코드는 ctype.csv 파일을 읽어 들여 구조체에 저장하는 코드다. 이를 기초로 수명(이어 출생년도, id)을 기준으로 오름차순으로 정렬하여 ctype_sorted.csv를 출력하는 코드를 작성하라. 또한 평균 수명을 Console에 출력하라.

11

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <assert.h>

typedef struct man { int id;

int byear;

int dyear;

char *pname;

} MAN;

MAN * new_man(char *pstr) {

char *pid = strtok(pstr,",");

char *pname = strtok(NULL,",");

char *pbyear = strtok(NULL,",");

char *pdyear = strtok(NULL,",");

MAN * nm = malloc(sizeof(MAN)+(pbyear-pname));

nm->id = atoi(pid);

nm->byear = atoi(pbyear);

nm->dyear = atoi(pdyear);

nm->pname = (char *) (nm+1);

strcpy(nm->pname, pname);

return nm;

}

void print_man(MAN * pman) {

printf("%s was born in %d and died in %d.\n", pman->pname, pman->byear,pman->dyear);

}

int main(void) {

FILE *fp = fopen("cpeople.csv","r");

char buffer[256];

MAN * mandb[100];

int nman=0,i;

assert(fp);

while (fgets(buffer,256,fp) && nman<100) { MAN *pm = new_man(buffer);

print_man(pm);

mandb[nman++] = pm;

}

for (i=0; i<nman; i++) free(mandb[i]);

fclose(fp);

return 0;

}

id

byear dyear pname

문제 7

참조

관련 문서