일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- str함수
- 이지젯
- get next line
- 포르투갈 여행
- 굿노트 스티커
- ft_printf
- 지베르니
- pipex
- 지베르니 가을
- ecole42
- pipex 42
- push swap 설명
- 알고리즘 기초
- printf
- 와인선별방법
- 42
- libft
- 42 so_long
- 와인 고르기
- push swap
- 42 libft
- 42 pipex
- 파리 피크닉
- 에꼴42
- gnl
- so_long
- 지베르니 여름
- get_next_line
- 서울42
- 지베르니 계절 추천
- Today
- Total
뇌 마음 반반저장소
[42_libft] Part 1 (str 함수들1 strlen, strchr, strrchr, strncmp) 본문
3. str 함수들
!Man 설명 정리!
문자열 처리 함수
C언어에서 문자열이란 마지막에 널 문자('\0)를 가지는 문자형 배열로 표현되며, 기본 타입에는 포함되지 않습니다.
따라서 C 컴파일러가 기본 타입을 위해 제공하는 다양한 연산자를 자유롭게 사용할 수 없습니다.
이 때문에 C언어는 문자열을 처리하기 위한 다양한 함수를 별도로 제공하고 있습니다.
C언어에서 제공하는 대표적인 문자열 처리 함수는 다음과 같습니다.
출처: 문자열 처리 함수
3-1. strlen
strlen란?
strlen - calculate the length of a string
문자열의 길이를 계산.
The strlen() function calculates the length of the string pointed to bys, excluding the terminating null byte ('\0').
strlen() 함수는 종료 null 바이트('\0')를 제외하고 문자열의 길이를 계산합니다.
반환 값 RETURN VALUE
The strlen() function returns the number of bytes in the string pointed to by s.
strlen() 함수는 s가 가리키는 문자열의 바이트 수를 반환합니다.
함수 선언 원형
#include <string.h>
size_t strlen(const char *s);
size_t는 무엇일까..? 👇
size_t는 다음과 같은 다양한 헤더 파일에 정의된 "부호 없는 정수 데이터 유형"입니다.
It’s a type which is used to represent the size of objects in bytes and is therefore used as the return type by the sizeof operator. It is guaranteed to be big enough to contain the size of the biggest object the host system can handle. Basically the maximum permissible size is dependent on the compiler; if the compiler is 32 bit then it is simply a typedef(i.e., alias) for unsigned int but if the compiler is 64 bit then it would be a typedef for unsigned long long. The size_t data type is never negative.
Therefore many C library functions like malloc, memcpy and strlen declare their arguments and return type as size_t.
객체의 크기를 바이트 단위로 나타내는 데 사용되는 유형이므로 연산자의 크기에 따라 반환 유형으로 사용됩니다. 호스트 시스템이 처리할 수 있는 가장 큰 개체의 크기를 포함할 수 있을 정도로 충분히 큰 것이 보장됩니다. 컴파일러가 32비트라면 단순히 부호 없는 int를 위한 typedef(즉, 별칭)이지만 컴파일러가 64비트라면 부호 없는 긴 시간 동안의 typedef이다. size_t 데이터 유형은 음수가 아닙니다.
따라서 malloc, memcpy, strlen과 같은 많은 C 라이브러리 함수들은 그들의 인수를 선언하고 타입을 size_t로 반환한다.
-> size_t는 아무 부호 없는 정수들의 타입을 꿀꺽해서 사용할 수 있다!
예를 들어,
음수가 아닌 정수로 값을 항상 만나보고 싶을 때!많이 사용한다.
// 여기서 'n'의 인수는 다음과 같은 최대 블록을 나타냅니다.
// 음이 아닌 것으로 보장되는 할당.
void *sizeoc(size_t n);
// 'n'바이트를 's2'에서 's1'로 복사하는 동안
// n은 음이 아닌 정수여야 합니다.
void *memcpy (표준 *s1, void const *s2, size_tn);
// strlen()은 문자열의 길이 때문에 size_t를 사용합니다.
// 항상 0 이상이 됩니다.
size_tstrlen(문자 상수 *s);
*흥미로운 점 : const char을 사용하는 이유는?
우리는 문자열을 건들지 않고 그냥 읽는 용으로 가져와서 숫자만 셀 것이기 때문이다. 그래서 우리의 데이터는 상수, 즉 const가 저장되는 곳인 데이터 영역에 쓰이면서 우리는 수정하거나 변경할 수 없다. const는 별이 어디에 붙느냐에 따라서 다른 의미를 가진다.
const char *s;
char const *s;
char * const s;
const char * const s;
char const * const s;
const char | *s; | s는 수정될 수 있으며, *s는 수정되지 않는다. | |
char const | *s; | 위와 동일한 의미 | |
char * const | s; | s는 수정되지 않고, *s는 수정될 수 있다. | |
const char * const | s; | s도 *s도 수정할 수 없다. | |
char const * const | s; | 위와 동일한 의미 |
!테스트 결과!
./main.out
how many letters in my line?
put somethin : I got the sexy brain ha!
strlen : 1
ft_strlen : 1
*흥미로운 점 : scanf로 strlen을 계산하면 스페이스 공백도 NULL로 인식한다;;
어..? 나는 길게 문장을 썼는데 내장함수과 내가 코드 한 함수 모두 1개라고 인식했다. 그래서 찾아본 결과.. scanf로 문장을 입력했을 때, %s 출력 형식은 는 스페이스 공백을 만나면 끝났다고 생각해서 그냥 그 자리에서 끝내버리는 치명적인 결함이 있다고 한다.. 스에상에!!! 그래서 찾아낸 신기한 출력 형식!
scanf("%[^\n]", str);
아래의 stackoverflow의 설명을 보자.
An '\n' (or any whitespace character) in the format string consumes an entire (possibly empty) sequence of whitespace characters in the input. So the scanf only returns when it encounters the next non-whitespace character, or the end of the input stream (e.g. when the input is redirected from a file and its end is reached, or after you closed stdin with Ctrl-D).
scanf 형식 문자열의 '\n'(또는 임의의 공백 문자)은 입력의 공백 문자 시퀀스 전체(빈)를 사용합니다. 따라서 스캔은 공백이 아닌 다음 문자 또는 입력 스트림의 끝(예: 입력이 파일에서 리디렉션 되어 해당 끝에 도달한 경우 또는 Ctrl-D로 stdin을 닫은 후)을 만날 때만 반환됩니다.
출처: Using "\n" in scanf() in C [duplicate]
그러니까 scanf의 ^\n은 화이트스페이스(space, tab, LF, VT, FF, CR)들을 무시하고, 줄 바꿈이 될 때까지 복사할 것!이다.흥미 진진하군!
! 테스트 결과!
$ ./main.out
how many letters in my line?
put somethin : I got the sexy brain ha!
strlen : 24
ft_strlen : 24
3-2. strchr
strchr란? : 원하는 글자(letter) 찾되 처음 나오는 단어부터 '\0' 전까지 반환하기
strchr, strrchr, strchrnul - locate character in string
문자열에서 문자를 찾기.
The strchr() function returns a pointer to the first occurrence of the character c in the string s.
strchr() 함수는 문자열에서 c 문자의 첫 번째 항목으로 포인터를 반환합니다.
The strrchr() function returns a pointer to the last occurrence of the character c in the string s.
strrchr() 함수는 문자열에서 c 문자의 마지막 항목으로 포인터를 반환합니다.
Here "character" means "byte"; these functions do not work with wide or multibyte characters.
여기서 "문자"는 "바이트"를 의미하며, 이러한 기능은 와이드 또는 멀티 바이트 문자에서는 작동하지 않습니다.
반환 값 RETURN VALUE
The strchr() and strrchr() functions return a pointer to the matched character or NULL if the character is not found. The terminating null byte is considered part of the string, so that if c is specified as '\0', these functions return a pointer to the terminator.
strchr() 및 strrchr() 함수는 일치하는 문자로 포인터를 반환하거나 문자를 찾을 수 없는 경우 NULL을 반환합니다. 종료 null 바이트는 문자열의 일부로 간주되므로 c가 '\0'으로 지정되면 이러한 함수는 종료자로 포인터를 반환합니다.
와이드 또는 멀티 바이트 문자란? 👇
A multibyte character is a character composed of sequences of one or more bytes. Each byte sequence represents a single character in the extended character set. Multibyte characters are used in character sets such as Kanji.
멀티바이트 문자는 하나 이상의 바이트 시퀀스로 구성된 문자이다. 각 바이트 시퀀스는 확장 문자 집합의 단일 문자를 나타냅니다. 멀티바이트 문자는 한자와 같은 문자 집합에서 사용됩니다.
Wide characters are multilingual character codes that are always 16 bits wide. The type for character constants is char; for wide characters, the type is wchar_t. Since wide characters are always a fixed size, using wide characters simplifies programming with international character sets.
넓은 문자는 항상 16비트 너비의 다국어 문자 코드입니다. 문자 상수의 유형은 char이고, 넓은 문자의 유형은 wchar_t입니다. 넓은 문자는 항상 고정된 크기이기 때문에 넓은 문자를 사용하면 국제 문자 집합으로 프로그래밍을 단순화할 수 있습니다.
-> 멀티바이트 문자열은 외국어를 싱글 바이트로 표현하기 위한 옛날 방식, 와이드 문자열은 아스키에 포함되지 않은 특수문자들.
출처: Multibyte and Wide Characters
함수 선언 원형
#include <string.h>
char *strchr(const char *s, int c);
!테스트 결과!
$ ./main.out
find the word!
put somethin : hello world #문장 넣기
which letter? : w #찾을 글자
strchr : world
ft_strchr : world
$ ./main.out
find the word!
put somethin : I got my power #문장넣기
which letter? : m #찾을 글자
strchr : my power
ft_strchr : my power
3-3. strrchr
strrchr란? : 원하는 글자(letter) 찾되 가장 마지막으로 나오는 위치부터 '\0'전까지 반환
strchr, strrchr, strchrnul - locate character in string
문자열에서 문자를 찾기.
The strrchr() function returns a pointer to the last occurrence of the character c in the string s.
strrchr() 함수는 문자열에서 c 문자의 마지막 항목으로 포인터를 반환합니다.
Here "character" means "byte"; these functions do not work with wide or multibyte characters.
여기서 "문자"는 "바이트"를 의미하며, 이러한 기능은 와이드 또는 멀티 바이트 문자에서는 작동하지 않습니다.
반환 값 RETURN VALUE
The strchr() and strrchr() functions return a pointer to the matched character or NULL if the character is not found. The terminating null byte is considered part of the string, so that if c is specified as '\0', these functions return a pointer to the terminator.
strchr() 및 strrchr() 함수는 일치하는 문자로 포인터를 반환하거나 문자를 찾을 수 없는 경우 NULL을 반환합니다. 종료 null 바이트는 문자열의 일부로 간주되므로 c가 '\0'으로 지정되면 이러한 함수는 종료자로 포인터를 반환합니다.
함수 선언 원형
#include <string.h>
char *strrchr(const char *s, int c);
!테스트 결과!
./main.out
find the word!
put somethin : hello hello hello world #문장입력
which word? : h #찾고싶은 단어
strlen : 23
strrchr : hello world
ft_strrchr : hello world
$ ./main.out
find the word!
put somethin : hello hello hello world
which word? : z
strlen : 23
strrchr : (null)
ft_strrchr : (null)
3-4. strncmp
strncmp란?
strcmp, strncmp - compare two strings
두 개의 문자열을 비교 (대소 문자도 구별)
The strcmp() function compares the two strings s1 and s2. The locale is not taken into account (for a locale-aware comparison, see strcoll(3)). The comparison is done using unsigned characters.
strcmp() 함수는 두 문자열 s1과 s2를 비교합니다. 로케일은 고려되지 않습니다(로케일 인식 비교는 strcoll(3) 참조). 비교는 부호 없는 문자를 사용하여 수행됩니다.
strcmp() returns an integer indicating the result of the comparison, as follows:
strcmp는 다음과 같이 비교 결과를 나타내는 정수를 반환합니다.
•0, if the s1 and s2 are equal; s1과 s2가 동일한 경우 0
•a negative value if s1 is less than s2; s1이 s2보다 작은 경우 음의 값
•a positive value if s1 is greater than s2. s1이 s2보다 클 경우 양의 값
The strncmp() function is similar, except it compares only the first (at most) n bytes of s1 and s2.
strncmp() 함수는 s1과 s2의 첫 번째(최대) n바이트만 비교한다는 점을 제외하면 유사합니다.
리턴 값 RETURN VALUE
The strcmp() and strncmp() functions return an integer less than, equal to, or greater than zero if s1 (or the first n bytes thereof) is found, respectively, to be less than, to match, or be greater than s2.
strcmp() 및 strncmp() 함수는 s1(또는 그 첫 번째 n바이트)이 s2보다 작거나 일치하는 경우 0보다 큰 정수를 반환합니다. -> 항상 두 단어의 아스키 값의 차이를 리턴! s1[i] - s2[i]
함수 선언 원형
#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);
!테스트 결과!
$ ./main.out
find a diff between 2 str!
1st string : i luv my cat
2nd string : i love my cat
strncmp : 6
ft_strncmp : 6
$ ./main.out
find a diff between 2 str!
1st string : helloHello
2nd string : hellohelle
strncmp : -32
ft_strncmp : -32
도움을 주고 싶으신 내용이나
틀린 내용이 있다면 댓글로 남겨주시고,
참고하신다면 꼭 출처를 밝혀주세요!
도움이 되었다면 공감 한 번씩 부탁드립니다❤️
'42 > libft' 카테고리의 다른 글
[42_libft] Part 1 (mem 함수들) (1) | 2022.12.09 |
---|---|
[42_libft] Part 1 (str 함수들2 strnstr, strdup, atoi) (0) | 2022.12.08 |
[42_libft] Part 1 (str 함수들2 strlcpy, strlcat) (1) | 2022.12.07 |
[42_libft] Part 1 (is와 to 함수들) (1) | 2022.12.06 |
[42_libft] 시작하며 (0) | 2022.11.27 |