뇌 마음 반반저장소

[42_libft] Part 1 (is와 to 함수들) 본문

42/libft

[42_libft] Part 1 (is와 to 함수들)

맹진저 2022. 12. 6. 00:54
728x90

자, 그러면 본격적으로 libft를 시작해 보겠다! libft는 평소 흔하게 쓰이는 함수들을 직접 만들어서 두고두고 사용할 수 있는 라이브러리를 만드는 것이다. 일단 챕터 3, Mandatory part의 part1을 훑어보자.

Chapter III

<Mandatory part>

Program name : libft.a
Turn in files : Makefile, libft.h, ft_*.c
Makefile : NAME, all, clean, fclean, re
External functs. : Detailed below
Libft authorized : n/a (해당 사항 없음)
Description : Write your own library: a collection of functions that will be a useful tool for your cursus.

(너만의 라이브러리를 써라: 너의 학업 동안 유용하게 사용될 함수들의 컬렉션~)

 

 1-1. 기술적 고려 사항 Technical considerations

• Declaring global variables is forbidden.

 전역 변수를 선언할 수 없다. 모두 함수 내부에서 시작되고 끝나는 지역변수로만 함수를 만들 것.
• If you need helper functions to split a more complex function, define them as static functions. This way, their scope will be limited to the appropriate file.

 더 복잡한 함수를 분할해서 도우미 함수가 필요한 경우에는 정적 함수(static)로 정의한다. 이렇게 하면 범위가 적절한 파일로 제한된다. 왜냐하면 그 함수 페이지에서만 사용하고 다른 곳에서는 사용할 수 없기 때문.

• Place all your files at the root of your repository.

 모든 파일을 하나의 폴더에 넣어라.

• Turning in unused files is forbidden.

 사용하지 않는 파일은 제출하지 마.

• Every .c files must compile with the flags -Wall -Wextra -Werror.

 모든 .c 파일은 -Wall -Wextra -Werror 플래그로 컴파일해야 한다.

• You must use the command ar to create your library. Using the libtool command is forbidden.

 라이브러리를 만드는 ar 명령어를 사용해서 너의 라이브러리를 만들 것. libtoo 명령어 못 쓴다!

• Your libft.a has to be created at the root of your repository.

 libft.a는 저장소의 루트 폴더에 만들어져야 한다.

 1-2. Part 1 - Libc functions

To begin, you must redo a set of functions from the libc. Your functions will have the same prototypes and implement the same behaviors as the originals. They must comply with the way they are defined in their man. The only difference will be their names. They will begin with the ’ft_’ prefix. For instance, strlen becomes ft_strlen.

시작하기에 앞서, 너는 libc에서부터 실행되는 함스들을 다시 해야 해. 너의 함수들은 오리지널 함수들과 같이 구현되며 같은 프로토타입(기초, 표준)을 가질 거야. 매뉴얼에 정의된 대로 만들어야만 해. 함수들은 'ft_' 접두사로 시작할 거야. 예를 들어서 strlen은 ft_strlen이 되는 거란다~ 

libc란?👇

더보기

C 표준 라이브러리(C standard library)는 C 언어를 위한 표준 라이브러리로서, ANSI C 표준에 의해 명시되었다. [1] 이것은 상위 집합인 C POSIX 라이브러리와 동시에 개발되었다. [2][3] ANSI C가 국제 표준화 기구에 의해서 채택됨에 따라, [4] C 표준 라이브러리는 또한 ISO C library로도 불린다.

C 표준 라이브러리는 매크로, 타입 정의 그리고 문자열 처리나 수학적 연산, 입출력 프로세스, 메모리 할당과 다른 운영 체제 서비스 같은 작업을 위한 함수들을 제공한다.

헤더 파일들

C 표준 라이브러리의 API는 많은 헤더 파일들에 정의되어 있다. 각 헤더 파일은 하나 이상의 함수 정의와 데이터 타입 정의 그리고 매크로들을 포함한다.

<assert.h>   assert 매크로를 포함하며, 이것은 프로그램의 디버깅 버전들에서 논리 오류들과 버그들의 다른 타입들을 탐지하는 것을 돕는데 사용된다.
<complex.h> C99 복소수를 조작하는데 사용되는 함수들의 집합.
<ctype.h>   그들의 타입에 따라 문자들을 분류하거나 대소문자를 전환하는데 사용되는 함수들의 집합을 정의한다.
<errno.h>   라이브러리 함수들에 의해 리포트되는 오류 코드들을 테스팅할 때 사용된다.
<fenv.h> C99 부동소수점 환경을 제어하는데 사용되는 함수들의 집합을 정의한다.
<float.h>   부동소수점 라이브러리의 구현된 속성을 명시하는 매크로 상수를 정의한다.
<inttypes.h> C99 정확한 정수형을 정의한다.
<iso646.h> NA1 여러 표준 토큰들을 표현하기 위한 대체 방식들을 구현하는 여러 매크로들을 정의한다.
<limits.h>   정수형 타입의 구현된 속성을 명시하는 매크로 상수를 정의한다.
<locale.h>   지역화 함수 정의
<math.h>   일반적인 수학 함수 정의
<setjmp.h>   setjmp 와 longjmp 매크로를 선언한다.
<signal.h>   시그널 핸들링 함수를 정의한다.
<stdalign.h> C11 객체들의 얼라인먼트를 질의하고 명시하기 위한.
<stdarg.h>   함수에 전달되는 인자들에 접근하기 위한.
<stdatomic.h> C11 스레드 사이에서 공유되는 데이터의 원자적 동작을 위한.
<stdbool.h> C99 불린 데이터 형 정의
<stddef.h>   여러 유용한 타입과 매크로 정의.
<stdint.h> C99 정확한 정수형을 정의.
<stdio.h>   핵심 입력과 출력 함수들을 정의한다.
<stdlib.h>   숫자 변환 함수들, 슈도 랜덤 숫자 생성 함수들, 메모리 할당, 프로세스 제어 함수들을 정의한다.
<stdnoreturn.h> C11 반환하지 않는 함수들을 명시하기 위한
<string.h>   문자열 처리 함수들을 정의한다.
<tgmath.h> C99 포괄형 수학 함수들을 정의한다.
<threads.h> C11 다중 스레드들과 뮤텍스 그리고 제어 변수들을 관리하는 함수들을 정의한다.
<time.h>   데이터와 시간 처리 함수들을 정의한다.
<uchar.h> C11 유니코드 문자들과 이것을 조작하는 함수들
<wchar.h> NA1 wide 문자열 처리 함수들을 정의한다.
<wctype.h> NA1 그들의 형에 따라 wide 문자들을 분류하거나 대소문자를 전환하는데 사용되는 함수들의 집합.

출처: C 표준 라이브러리

 

💡 some of the functions’ prototypes you have to redo use the ’restrict’ qualifier. This keyword is part of the c99 standard. It is therefore forbidden to include it in your own prototypes and to compile your code with the -std=c99 flag.

몇 함수들은 'restrict(수정)' 수식 어구를 사용해 표준을 다시 가져야 해. 이 키워드는 c99표준의 일부인데, 이걸 너의 표준에 포함시키거나 -std=c99 플래그를 너의 코드에서 컴파일하는 건 금지야!

 

You must write your own function implementing the following original ones. They do not require any external functions :

너는 너만의 함수를 오리지널의 원칙을 따르면서 구현해야 해. 얘네들은 어떤 외부 함수도 사용할 수 없어.

 

1. is 함수들

!Man 설명 정리!

is 함수 설명
isalpha, isalnum, isascii, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit - Routines de classification de caractères.
문자 분류 루틴.

These functions check whether c, which must have the value of an unsigned char or EOF, falls into a certain character class according to the specified locale. The functions without the "_l" suffix perform the check based on the current locale.
이러한 함수는 "unsigned char(부호 없는 문자)" 또는 "EOF(end of file)" 값을 가져야 하는 c가 지정된 로케일에 따라 특정 문자 클래스에 속하는지 여부를 확인합니다. 접미사 "_l"이 없는 함수는 현재 로케일을 기준으로 검사를 수행합니다.

The functions with the "_l" suffix perform the check based on the locale specified by the locale object locale. The behavior of these functions is undefined if locale is the special locale object LC_GLOBAL_LOCALE (see duplocale(3)) or is not a valid locale object handle.
접미사가 "_l"인 함수는 로케일 개체 로케일에서 지정한 로케일을 기준으로 검사를 수행합니다. 로케일이 특수 로케일 개체 LC_GLOBAL_LOCALE((3) 참조)이거나 올바른 로케일 개체 핸들이 아닌 경우 이러한 함수의 동작이 정의되지 않습니다.

The list below explains the operation of the functions without the "_l" suffix; the functions with the "_l" suffix differ only in using the locale object locale instead of the current locale.
아래 목록은 접미사 "_l"을 사용하지 않는 함수의 작동을 설명합니다.(모든 is 함수 목록)
접미사 "_l"을 사용하는 함수는 현재 로케일 대신 로케일 개체의 로케일을 사용하는 경우에만 다릅니다.

반환 값 RETURN VALUE
The values returned are nonzero if the character c falls into the tested class, and zero if not. 
반환되는 값은 문자 c가 테스트된 클래스에 포함되면 0이 아닌 숫자, 포함되지 않으면 0이 됩니다.

locale이란? 각 지역의 사용자 수식 팩이다. 우리가 가끔 한국어가 코딩에 깨져서 나온다면 한국 로컬 팩이 설치되지 않아서이다. 리눅스에서 아래의 명령어로 찾아볼 수 있다!

ls /usr/lib/locale

위의 말은 우리가 코딩할 is함수들은 로케일 되지 않은 함수이다. 예를 들어 프랑스어처럼 악센트가 들어갔다던지.. 한국말 이라던지.. 이런 다른 언어들은 로케일 파일에 참조되어 저장된다. 우리는 확장된 로케일을 참조하며 검사하는 프로그램을 만들지 않는다는 것이다. 그저 영어 알파벳만 검사하는 "ft_isalpha"만 한다는 것. 그래서 우리는 예를 들어 "ft_isalpha_l"을 건들지 않을 것이다.

우리는 is함수를 만들면서 표준 단어들, 즉 영어 알파벳, 아라비아 숫자 등을 검사할 함수를 만든다!

 

EOF란?👇

더보기

컴퓨팅에서, 파일 끝(End of File, EOF [1])는 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타낸다.

C 표준 라이브러리에서 getchar와 같은 문자 입력 함수는 파일의 끝을 만났음을 알리기 위해 매크로로 정의된 EOF 값을 리턴한다. EOF의 실제 값은 시스템에 따라 다르며 (그러나 보통 glibc에서와 같이 -1로 정의된다) 어떠한 유효한 문자의 값과도 겹치지 않는다. 블록 입력 함수는 입력받은 문자의 수를 리턴하므로, 요구한 입력의 길이보다 작은 수를 리턴할 경우 EOF를 만난 것으로 간주할 수 있다.

출처 : 파일 끝 EOF란?

 1-1. isalpha

isalpha란?

checks for an alphabetic character; in the standard "C" locale, it is equivalent to (isupper(c) || islower(c)). In some locales, there may be additional characters for which isalpha() is true---letters which are neither uppercase nor lowercase.
표준 "C" 로케일에서는 (isupper(c) || is lower(c))와 동일하다. 일부 로케일에는 대문자도 소문자도 아닌 문자인 isalpha()가 true인 추가 문자가 있을 수 있다.

1. 대문자 소문자를 다 가지고 있는지와 동일한 함수이다. 

 - 대문자 구간은 1로 반환한다.

 - 소문자 구간은 2로 반환한다.

 - 둘 다 아닌 것은 0으로 반환한다.

2. 일부 로케일(locale)에서는 대문자도 소문자도 아닌데 알파벳일 경우가 있다.

(하지만 우리는 다른 로케일은 신경 쓰지 않아도 된다!)

 

함수 선언 원형

int	isalpha(int c);

함수 연산자 다시 기억해보기👇

더보기

&& : 둘 다 만족했을 때

|| : 둘 중에서 하나라도 만족했을 때

== : 둘이 같을 때

!= : 둘이 같지 않을 때

참 거짓 숫자와 리턴 값 숫자 헷갈리지 말기 👇

더보기

보통 참은 1, 거짓은 0이다.

 

하지만 메인에서 리턴 값을 return(0)으로 하는 이유는 아무런 오류 없이 끝났다는 뜻.

! 테스트 결과!

$ gcc main.c ft_isalpha.c
$ ./a.out
put somethin : l #값 입력하기 엘!
if is alpha, will print any number but 0! #만약에 알파벳이면 0이 아닌 아무숫자나 출력됩니다.
isalpha : 1024 #표준함수
ft_isalpha : 108 #내가만든 함수

$ ./a.out
put somethin : 0 #숫자를 입력해봄
if is alpha, will print any number but 0!
isalpha : 0
ft_isalpha : 0

 1-2. isdigit

isdigit이란?

checks for a digit (0 through 9).
디짓 (0부터 9까지)인지 확인한다.

함수 선언 원형

int	isdigit(int c);

헷갈리지 말 것 :  int 타입의 정수가 아니라 ascii의 숫자 타입을 선별해주는 프로그램이다! (부들부들 이게 왜 햇갈렸뇽)  

 

! 테스트 결과!

$ gcc main.c ft_isdigit.c

$ ./a.out
put somethin : 1 #숫자 1 대입
if is number, will print any number but 0!
isdigit : 2048
ft_isdigit : 49 #참

$ ./a.out
put somethin : d #알파벳 d 대입
if is number, will print any number but 0!
isdigit : 0
ft_isdigit : 0 #거짓

$ ./a.out
put somethin : 67 #숫자 67 대입
if is number, will print any number but 0!
isdigit : 2048
ft_isdigit : 54 #참

$ ./a.out
put somethin : 23456 #숫자 23456 대입
if is number, will print any number but 0!
isdigit : 2048
ft_isdigit : 50 #참

$ ./a.out
put somethin : jj #알파벳 jj 대입
if is number, will print any number but 0!
isdigit : 0
ft_isdigit : 0 #거짓

#첫번째 캐릭터만 검사하고 끝낸다..!

 

 

 1-3. isalnum

isalnum이란?

checks for an alphanumeric character; it is equivalent to (isalpha(c) || isdigit(c))
알파벳과 숫자를 확인한다.

함수 선언 원형

int	isalnum(int c);

!테스트 결과!

$ gcc main.c ft_isalnum.c
$ ./a.out
put somethin : l #알파벳 l을 대입
if is number or alpha, will print any number but 0!
isalnum : 8
ft_isalnum : 108 #참

$ ./a.out
put somethin : 2 #숫자 2를 대입
if is number or alpha, will print any number but 0!
isalnum : 8
ft_isalnum : 50 #참

$ ./a.out
put somethin : ^ #다른걸 대입
if is number or alpha, will print any number but 0!
isalnum : 0
ft_isalnum : 0 #거짓

 

 1-4. isascii

isascii란?

checks whether c is a 7-bit unsigned char value that fits into the ASCII character set.
c가 ASCII 문자 집합에 맞는 7비트 "부호 없는 문자 값"인지 확인한다.

함수 선언 원형

int	isascii(int c);

!테스트 결과!

*테스트 결과 isascii는 참이면 1, 거짓이면 0으로 출력했다.

$ ./a.out
put somethin : a #아스키 범위 내
if is ascii, will print any number but 0!
isascii : 1
ft_isascii : 1 #참

$ ./a.out
put somethin : 안녕하세요 #한국말을 모르는 아스키
if is ascii, will print any number but 0!
isascii : 0
ft_isascii : 0 #거짓

 1-5. isprint

isprint란?

checks for any printable character including space.
공백을 포함하여 인쇄 가능한 문자가 있는지 확인한다.

함수 선언 원형

int	isprint(int c);

!테스트 결과!

t$ ./main.out
put somethin :      #tab을 입력!
if is print, will print any number but 0!
isprint : 0
ft_isprint : 0 #거짓

$ ./main.out
put somethin :  #스페이스를 입력!
if is print, will print any number but 0!
isprint : 16384
ft_isprint : 32 #참!

2. to 함수들

! Man 설명 정리!

toupper, tolower, toupper_l, tolower_l - convert uppercase or lowercase 
대문자 또는 소문자로 변환.

These functions convert lowercase letters to uppercase, and vice versa.
이러한 기능은 소문자를 대문자로 변환하고, 그 반대의 경우(대문자에서 소문자로)도 마찬가지입니다.

If c is neither an unsigned char value nor EOF, the behavior of these functions is undefined.
The behavior of toupper_l() and tolower_l() is undefined if locale is the special locale object LC_GLOBAL_LOCALE (see duplocale(3)) or is not a valid locale object handle.  
c가 "부호 없는 문자 값"도 "EOF"도 아닌 경우, 이러한 함수의 동작은 정의되지 않습니다.
로케일이 특수 로케일 개체 LC_GLOBAL_LOCale(3) 참조)이거나 올바른 로케일 개체 핸들이 아닌 경우 topper_l() 및 tolower_l()의 동작이 정의되지 않습니다.

반환 값 RETURN VALUE
The value returned is that of the converted letter, or c if the conversion was not possible. 
반환되는 값은 변환된 문자의 값이거나, 변환이 불가능한 경우 c를 반환합니다.

 2-1. toupper

toupper 란?

If c is a lowercase letter, toupper() returns its uppercase equivalent, if an uppercase representation exists in the current locale. Otherwise, it returns c. The toupper_l() function performs the same task, but uses the locale referred to by the locale handle locale.
c가 소문자인 경우 toupper()는 대문자로 변환해서 반환합니다. 그렇지 않으면 c를 반환합니다. toupper_l() 함수는 동일한 작업을 수행하지만 로케일이 참조하는 로케일을 사용합니다.

함수 선언 원형

int	toupper(int c);

! 테스트 결과!

$ ./main.out
put somethin : a #소문자를 넣으면
if is small letter, will change big letter any number but 0!
toupper : A
ft_toupper : A #대문자로 바뀌고

$ ./main.out
put somethin : z
if is small letter, will change big letter any number but 0!
toupper : Z
ft_toupper : Z

$ ./main.out
put somethin : 1 #소문자가 아닌 아무거나 넣으면
if is small letter, will change big letter any number but 0!
toupper : 1
ft_toupper : 1 #그냥 출력된다!

 2-2. tolower

tolower란?

If c is an uppercase letter, tolower() returns its lowercase equivalent, if a lowercase representation exists in the current locale. Otherwise, it returns c. The tolower_l() function performs the same task, but uses the locale referred to by the locale handle locale.
c가 대문자인 경우, tolower()는 소문자로 전환해서 반환합니다. 그렇지 않으면 c를 반환합니다. tolower_l() 함수는 동일한 작업을 수행하지만 로케일이 참조하는 로케일을 사용합니다.

함수 선언 원형

int	tolower(int c);

!테스트 결과!

$ ./main.out
put somethin : A #대문자가 들어오면
if is big letter, will change small letter any number but 0!
tolower : a
ft_tolower : a #소문자로 바꿔준다

$ ./main.out
put somethin : Z
if is big letter, will change small letter any number but 0!
tolower : z
ft_tolower : z

$ ./main.out
put somethin : 9 #대문자가 아닌 아무거나 들어오면
if is big letter, will change small letter any number but 0!
tolower : 9
ft_tolower : 9 #그대로 출력한다

 

 

 

 

도움을 주고 싶으신 내용이나

틀린 내용이 있다면 댓글로 남겨주시고,

도움이 되었다면 공감 한 번씩 눌러주세요👍❤️

728x90
Comments