문제 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
출력 결과
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
출력 결과
문제 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.
출력 결과
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;
}
문제 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;
문제 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;
}
문제 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
문제 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.
출력 결과
Comma Separated Values
❖ 메모장을 이용하여 아래와 같이 작성하고 cpeople.csv로 저장하라.
▪ 확장자 csv에 유의하라.
▪ csv는 Comma Separated Values를 의 미한다.
❖ 저장한 CSV 파일을 Excel에서 읽 어 보라.
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;
}