SWE2007: Software Experiment II (Fall 2014) Programming Assignment #0: Making own "string_sw.h" Due: 22nd Sep. (Mon), 11:59 PM 1. Introduction 이번과제에선, 앞으로있을다른과제들을수행하기위한필요할함수들을구현한다. 그대상은, 문자열조작 / 검사 / 변환함수들을담은 C 표준라이브러리의 <string.h> 를비롯한헤더파일의 일부함수이다. 그리고본과제의다른목적은학생이각자독자적인 Linux 환경을갖추는것이다. 2. Problem specification 본과목에서과제를수행할때, Linux 시스템콜과같은일부특수한함수들을제외하곤 C 표준라이브러리나다른라이브러리함수들을사용하는것이허락되지않는다. 따라서자신이필요한함수들을직접구현해야하는데, C 표준라이브러리의 <string.h> 를비롯한문자열을이용하는함수들은앞으로거의모든과제에서필요할것이기때문에, Linux 환경에서이함수들을직접구현해본다. 구현할함수와각함수의기능은다음과같다 : (C 표준함수의경우, 정확한함수정의를찾는방법은 5. Background 에서따로설명한다. 밑줄을친함수들은 C 표준함수가아님을뜻하고, 해당함수들에대한정의는 Section 2.1. 에서설명한다. atoi2, atol2 함수는 C 표준 atoi, atol 함수를구현한뒤, 명시된대로이름을바꾼다.) Conversions string to numeric formats: int atoi2 (const char *str); - 문자열 str을정수형 int로변환하여출력 [int는 32비트정수형으로간주 ] long atol2 (const char *str); - 문자열 str을정수형 long으로변환하여출력 [long은 64비트정수형으로간주 ] Conversions numeric formats to string: char *int2str (char *dest, int num); - 정수형 num을문자열로변환한뒤문자열버퍼 dest에저장 - [int:-543210 C string:"-543210"] String manipulation: char *strcpy (char *dst, const char *src); - 문자열 src 를문자열버퍼 dst 로복사
char *strncpy (char *dst, const char *src, size_t count); - 문자열 src에서 count 바이트만큼문자열버퍼 dst로복사 char *strcat (char *dst, const char *src); - 문자열 dst의뒤에, 문자열 src을붙임 char *strncat (char *dst, const char *src, size_t count); - 문자열 dst의뒤에, 문자열 src를 count 바이트만큼붙임 char *strdup (const char *str); - 문자열 str을동적으로할당받은메모리에 (malloc 등 ) 복사한뒤해당주소를반환 String examination: size_t strlen (const char *str); - 문자열 str의길이를반환 int strcmp (const char *lhs, const char *rhs); - 문자열 lhs, rhs을비교 int strncmp (const char *lhs, const char *rhs, size_t count); - 문자열 lhs, rhs를최대 count 바이트만비교 char *strchr (const char *str, int ch); - 문자열 str에서문자 ch가처음나타나는위치를찾음 char *strrchr (const char *str, int ch); - 문자열 str에서문자 ch가마지막으로나타나는위치를찾음 char *strpbrk (const char *str, const char *accept); - 문자열 str에서 문자열 accept의아무문자 가처음으로등장하는위치를찾음 char *strstr (const char *str, const char *substr); - 문자열 str에서부분문자열 substr이처음으로등장하는위치를찾음 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 로변경 각함수들은 C 표준함수들이제공하는기능과 100% 동일하게구현하면되고, 다른기능을추가 할필요는없다.
2.1. Definition of int2str, strdup, and strtok_r functions char *int2str (char *dest, int num); 숫자 num을 C 문자열형태로바꿔 dest에저장하고, 변환된문자열을반환한다. ( 일반적인경우, 반환값은 dest가될것이다.) 즉, 바뀐문자열이반환된다는점을제외하면, 다음함수호출과동일한행동이수행되어야한다 : sprintf(dest, "%d", num); 예외 ) 인자 dest가 NULL일경우, 동적으로메모리를받고해당주소에변환한문자열을저장한다음, 그주소를반환한다. 동적메모리할당에실패하면 NULL을반환한다. 참고 ) int형을문자열로변환할경우, 최악의경우 NULL 캐릭터를포함하여 char[12] 버퍼가필요하다. char *strdup (const char *str); 동적으로메모리를할당받고, 해당주소에문자열 str의내용을복사한뒤, 해당주소를반환한다. 예외 ) 메모리를동적으로할당받을수없다면, NULL을반환한다. 참고 ) $ man 3 strdup 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 이번과제수행을위해다음 1 개의파일이주어진다 : string_sw.h: 본과제에서지정한함수들이들어있는헤더파일 string_sw.h 를이용하여새로운 C 파일을생성하고, 해당 C 파일에 string_sw.h 파일의함 수들을구현한다.
4. Verification of your code 다음그림과같이검사용파일을만들어서, <string.h> 과 <stdlib.h> 를 "string_sw.h" 로 바꿨을때구현한함수가같은이름의라이브러리함수와동일한결과물을생성하는지비교해본 다. #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char str1[20] = "Hello"; char str2[20] = "world!"; printf("<strlen> str1: %zu\n", strlen(str1));... } return 0; #include <stdio.h> #include "string_sw.h" int main() { char str1[20] = "Hello"; char str2[20] = "world!"; printf("<strlen> str1: %zu\n", 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 작성한코드상단의주석에이름과학번을작성한다. 작성한 c 파일의이름을 " 학번.c" 로바꾼다. (e.g., 2008311920.c) 본과제수행시구현방법과디자인을설명하는보고서를 PDF 포맷으로작성하여 " 학 번.pdf" 이란이름을붙인다. ( 가능하면 PDF 가가장좋지만, 대중적인문서포맷은다른 포맷도괜찮음 ) 보고서에는본인이구현한 Linux 환경에대한스크린샷을첨부한다. 추가적으로, Linux 셸에서다음 3 가지명령을실행시킨결과를같이첨부한다. $ cat /proc/version $ cat /etc/issue $ lsb_release -a 과제를제출하기위해 [wooyeong at csl.skku.edu] 주소로메일을보낸다. 메일전송시 전술한코드파일과문서파일을각각첨부하고 ( 압축하지말것!), 메일제목은다음과같
이명명한다 : [SWE2007] PA #0, 학번, 이름 8. Logistics 본과제는혼자수행한다. 제출상태는과목홈페이지 http://csl.skku.edu/swe2007f14/projects 에즉각적으로공지될것이다. 과제제출시간은메일도착시간을기준으로하며, 과제를지연제출하면기한직후부터매 8시간마다점수를 10% 씩추가로감점한다. 다른사람의과제를 copy할경우, 개입한사람전부해당과제에대해 0점처리되고, 교수님께보고되며, 성적산정에불이익이있다. 또한, copy가두차례이상적발될경우 F 학점이부여될수있다. Have fun! 정우영, 담당조교 컴퓨터시스템연구실