SSE2033: System Software Experiment II (Spring 2016) Programming Assignment #0: Making own "my_string.h" Due: 21st Mar. (Mon), 11:59 PM 1. Introduction 이번과제에선, 앞으로있을다른과제들을수행하기위한필요할함수들을구현한다. 그대상은, 문자열조작 / 검사 / 변환함수들을담은 C 표준라이브러리의 <string.h> 를비롯한헤더파일의일부함수이다. 그리고본과제의다른목적은학생이각자독자적인 Linux 환경을갖추는것이다. 또한, 간단한문자열및포인터조작을통해향후원활한과제수행을돕고자한다. 2. Problem specification 본과목에서과제를수행할때, Linux 시스템콜과같은일부특수한함수들을제외하곤 C 표준라이브러리나다른라이브러리함수들을사용하는것이허락되지않는다. 따라서자신이필요한함수들을직접구현해야하는데, C 표준라이브러리의 <string.h> 를비롯한문자열을이용하는함수들은앞으로거의모든과제에서필요할것이기때문에, Linux 환경에서이함수들을직접구현해본다. 또한, 향후과제에서본인이필요한함수는 my_string.c 및.h에구현하여사용할수있다. 구현할함수와각함수의기능은다음과같다. 각함수들은 C 표준함수들이제공하는기능과 100% 동일하게구현하면되고, 다른기능을추가할필요는없다. (C 표준함수의경우, 정확한함수정의를찾는방법은수업시간에설명한대로리눅스매뉴얼 페이지 man 을사용하도록한다. 밑줄을친함수들은 C 표준함수가아님을뜻하고, 해당함수들 에대한정의는 Section 2.1. 에서설명한다.) strtok_r 을구현하지않아도되나, 구현할시에는추가점수를받을수있다.
Conversions string to numeric formats: int my_atoi (const char *nptr); - 문자열 str을정수형 int로변환하여출력 long my_atol (const char *nptr); - 문자열 str을정수형 long으로변환하여출력 Conversions numeric formats to string: char *int2str (char *dest, int num); - 정수형 num을문자열로변환한뒤문자열버퍼 dest에저장 - [int:-543210 C string:"-543210"] String manipulation: char *strcpy (char *dest, const char *src); - 문자열 src를문자열버퍼 dst로복사 char *strncpy (char *dest, const char *src, size_t n); - 문자열 src에서 count 바이트만큼문자열버퍼 dst로복사 char *strcat (char *dest, const char *src); - 문자열 dst의뒤에, 문자열 src을붙임 char *strncat (char *dest, const char *src, size_t n); - 문자열 dst의뒤에, 문자열 src를 count 바이트만큼붙임 char *strdup (const char *str); - 문자열 str을동적으로할당받은메모리에 (malloc 등 ) 복사한뒤해당주소를반환 char *int2str (char *dest, int num); 숫자 num을 C 문자열형태로바꿔 dest에저장하고, 변환된문자열을반환한다. ( 일반적인경우, 반환값은 dest가될것이다.) 즉, 바뀐문자열이반환된다는점을제외하면, 다음함수호출과동일한행동이수행되어야한다 : sprintf(dest, "%d", num); 예외 ) 인자 dest가 NULL일경우, 동적으로메모리를받고해당주소에변환한문자열을저장한다음, 그주소를반환한다. 동적메모리할당에실패하면 NULL을반환한다. 힌트 ) int형을문자열로변환할경우, 최악의경우 NULL 캐릭터를포함하여 char[12] 버퍼가필요하다.
String examination: size_t strlen (const char *s); - 문자열 s의길이를반환 int strcmp (const char *s1, const char *s2); - 문자열 s1, s2를비교 int strncmp (const char *s1, const char *s2, size_t n); - 문자열 s1, s2를최대 n 바이트만비교 char *strchr (const char *s, int c); - 문자열 s에서문자 c가처음나타나는위치를찾음 char *strrchr (const char *s, int c); - 문자열 s에서문자 c가마지막으로나타나는위치를찾음 char *strstr (const char *haystack, const char *needle); - 문자열 haystack에서부분문자열 needle이처음으로등장하는위치를찾음 char *strtok (char *str, const char *delim); - 문자열 str에서 문자열 delim의아무문자 가등장하는위치를찾고, token화함 char *strtok_r (char *str, const char *delim, char **saveptr); - strtok 함수와동일하지만다음 token을처리할위치를담는 saveptr 변수를사용 Character array manipulation: void *memcpy (void *dest, const void *str, size_t n); - 메모리주소 str에서 n 바이트만큼메모리주소 dest로복사 void *memset (void *dest, int ch, size_t count); - 메모리주소 [dest. dest+count) 의값을 ch 로변경 char *strdup (const char *str); 동적으로메모리를할당받고, 해당주소에문자열 str의내용을복사한뒤, 해당주소를반환한다. 예외 ) 메모리를동적으로할당받을수없다면, NULL을반환한다. 참고 ) $ man 3 strdup strtok_r 은구현할시선택사항으로, 성공하면추가점수가있다. char *strtok_r (char *str, const char *delim, char **saveptr); 기본적으로 strtok 함수와동일하지만, 연속적으로 strtok[_r] 함수를호출할때차이점이있다. strtok 함수는함수내부의버퍼를두어다음에처리할주소를저장하지만, strtok_r 함수는내부의버퍼대신 saveptr에주소를담아그주소를사용한다는차
이점이있다. str이존재하면첫째토큰을처리하고, 다음부터처리할주소를 saveptr에담은뒤, 토큰의주소를반환한다. str이 NULL이라면, saveptr에담긴주소를가져와다음토큰을처리하고다음에처리할주소로 saveptr을업데이트한뒤, 토큰의주소를반환한다. 더이상토큰을생성할수없으면 NULL을반환한다. 참고 ) $ man 3 strtok_r 참고 ) saveptr에담길주소에정답은없으니스스로판단한다. 3. Skeleton codes 이번과제수행을위해다음 3 개의파일이주어진다 : my_string.h: my_string.c: test.c: 본과제에서지정한함수들이들어있는헤더파일 본과제에서지정한함수들의구현파일 구현한함수들의디버깅용파일 Skeleton codes 들은전부 C library 함수를단순히 wrapping하는꼴로이루어져있으며, 이를자신만의코드로바꾸어야한다. 4. Verification of your code 제공한 test.c 파일을이용해각자자유롭게자신들이만든함수가라이브러리함수와동일한지비교할수있다. 예시는아래와같다. #include <stdio.h> #include <string.h> #include <stdlib.h> #include "my_string.h" int main() { char str1[20] = "Hello"; char str2[20] = "world!"; printf("<strlen> str1: %zu\n", strlen(str1)); printf("<strlen> str1: %zu\n", my_strlen(str1));... } return 0;
5. Background 5.1. Man page 본과목의과제를수행하며 man page (manual pages) 를참고할수있다. man page는 Unix-like 환경에서제공하는참고용매뉴얼프로그램이다. 어떤함수의정의나프로그램의역할이궁금하면셸에서다음커맨드를입력함으로써정보를찾아볼수있다. $ man <COMMAND_OR_FUNCTION_NAME> 예를들면, strlen 함수에대한정의를찾아보고싶을땐, "$ man strlen" 을입력한다. printf 와같은함수는동명의프로그램과라이브러리함수가같이존재하는데, 이럴경우엔라 이브러리섹션을지정해서 man 프로그램을호출한다. ( 참고 : http://en.wikipedia.org/wiki/man_page) $ man 3 printf 만약 man 프로그램이제대로동작하지않을경우, Ubuntu 의경우다음명령어를입력함으로써 라이브러리에대한매뉴얼을다운로드할수있다. 다음명령수행엔관리자권한이필요하다. $ sudo apt-get install manpages-dev manpages-posix-dev 5.2. C References C 라이브러리함수에대한 reference는다음사이트를참고한다 : http://www.cplusplus.com/reference/clibrary/ http://en.cppreference.com/w/ 6. Restrictions 함수구현시 malloc(), calloc(), free() 함수를제외한다른라이브러리함수는사 용할수없다. 필요하다면, 직접구현하여사용한다. 7. Hand in instruction 작성한코드상단의주석에이름과학번을작성한다. 본과제수행시구현방법과디자인을설명하는보고서를 PDF 포맷으로작성하여 "README.pdf" 이란이름을붙인다. ( 가능하면 PDF가가장좋지만, 대중적인문서포맷은다른포맷도괜찮음 )
보고서에는본인이구현한 Linux 환경에대한스크린샷을첨부한다. Linux 셸에서다음 3 가지명령을실행시킨결과를같이첨부한다. $ cat /proc/version $ cat /etc/issue $ lsb_release -a test.c 파일을제외하고, my_string.c, my_string.h, README.pdf, screenshot 총 4 개의파일을 tar 로압축한다. 이때, 압축하는파일이름은반드시본인학번으로한다. Ex) 학번이 2014123456 인경우, $ tar -cvzf 2014123456.tar.gz my_string.c my_string.h README.pdf screenshot 과제를제출하기위해 [dylee@csl.skku.edu] 주소로메일을보낸다. 메일전송시압축한 tar 파일하나만첨부하도록하며, 메일제목은다음과같이명명한다 : [SSE2033] 학번이름 PA#0 [SSE2033] 2014123456 홍길동 PA#0 8. Logistics 본과제는혼자수행한다. 질문또한 dylee@csl.skku.edu에메일로보내며, 메일제목앞에는필히 [SSE2033] 을쓰도록한다. 제출상태는과목홈페이지 http://csl.skku.edu/sse2033s16/projects 에즉각적으로공지될것이다. 과제제출시간은메일도착시간을기준으로하며, 과제를지연제출하면기한직후부터매 8시간마다점수를 10% 씩추가로감점한다. 다른사람의과제를 copy할경우, 개입한사람전부해당과제에대해 0점처리되고, 교수님께보고되며, 성적산정에불이익이있다. 또한, copy가두차례이상적발될경우 F 학점이부여될수있다. Warming up! Dong-Yun Lee, TA Computer Systems Laboratory, Sungkyunkwan Univ.