Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- ft_printf
- 지베르니 여름
- 와인 고르기
- push swap
- 에꼴42
- pipex 42
- gnl
- printf
- so_long
- 서울42
- 42 pipex
- 지베르니 가을
- push swap 설명
- ecole42
- 지베르니 계절 추천
- pipex
- str함수
- 지베르니
- get next line
- 42
- 굿노트 스티커
- get_next_line
- 이지젯
- libft
- 와인선별방법
- 42 so_long
- 알고리즘 기초
- 42 libft
- 포르투갈 여행
- 파리 피크닉
Archives
- Today
- Total
뇌 마음 반반저장소
[42_libft] Part 1 (str 함수들2 strnstr, strdup, atoi) 본문
728x90
3-7. strnstr
strnstr이란?
strnstr - locate a substring in a string
문자열에서 부분 문자열을 찾기.
The strnstr function locates the first occurrence of the null-terminated string little in the string big , where not more than len characters are searched. Characters that appear after a `\0' character are not searched. Since the strnstr function is a specific API, it should only be used when portability is not a concern.
strnstr 함수는 문자열 big에서 little 문자열을 len 범위 안에서 찾습니다. '\0' 문자 뒤에 나타나는 문자는 검색되지 않습니다. strstr 함수는 특정 API이므로 이식성이 문제가 되지 않는 경우에만 사용해야 합니다.
반환 값 RETURN VALUES
If little is an empty string, big is returned; if little occurs nowhere in big , NULL is returned; otherwise a pointer to the first character of the first occurrence of little is returned.
little 문자열이 비어 있으면 big 문자열이 반환되고,
big 문자열에 little 문자열이 없으면 NULL이 반환되며,
그렇지 않으면 little 문자열의 첫 번째 문자에 대한 포인터가 반환됩니다.
함수 선언 원형
#include <string.h>
char *strnstr(const char *big, const char *little, size_t len);
!테스트 결과!
$ gcc -o test2 test2.c -lbsd
$ ./test2
finding your word here
1st string : everything everywhere all at once #문장
find word : every #찾고싶은 단어
strnstr : everything everywhere all at once #원형함수
ft_strnstr : everything everywhere all at once #내 함수
$ ./test2
finding your word here
1st string : i hope i do the coding myself
find word : do
strnstr : do the coding myself
ft_strnstr : do the coding myself
$ ./test2
finding your word here
1st string : brabrabrabrabrabrother
find word : bro
strnstr : brother
ft_strnstr : brother
마지막 테스트처럼 반복되는 단어를 적어 테스트해보자..!
3-8. strdup
strdup이란?
strdup, strndup, strdupa, strndupa - duplicate a string
문자열 복사
The strdup() function returns a pointer to a new string which is a duplicate of the string s. Memory for the new string is obtained with malloc(3), and can be freed with free(3).
strup() 함수는 문자열의 중복인 새 문자열로 포인터를 반환합니다. 새 문자열에 대한 메모리는 malloc(3)로 가져오고, free(3)로 해제할 수 있습니다.
RETURN VALUE
On success, the strdup() function returns a pointer to the duplicated string. It returns NULL if insufficient memory was available, with errno set to indicate the error.
strup() 함수는 성공하면 중복된 문자열에 대한 포인터를 반환합니다.
사용 가능한 메모리가 부족하면 NULL을 반환하고
오류는 오류를 나타내도록 설정됩니다.
malloc 이란?
malloc, free, calloc, realloc, realloc array - allocate and free dynamic memory
동적 메모리 할당 및 사용 가능
The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not initialized. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().
malloc() 함수는 크기 바이트를 할당하고 할당된 메모리로 포인터를 반환합니다. 메모리가 초기화되지 않았습니다. 크기가 0이면 malloc()는 NULL을 반환하거나 나중에 free()로 성공적으로 전달할 수 있는 고유 포인터 값을 반환합니다.
The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc(), or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs. If ptr is NULL, no operation is performed.
free() 함수는 malloc(), calloc() 또는 realloc()에 대한 이전 호출에 의해 반환된 by ptr을 가리키는 메모리 공간을 확보합니다. 그렇지 않은 경우 또는 free(ptr)가 이미 호출된 경우 정의되지 않은 동작이 발생합니다. ptr이 NULL이면 작업이 수행되지 않습니다.
malloc의 메모리 저장 영역 및 메모리에 대한 설명 보기👇
더보기
[42] 왕초보의 헤더 파일(Header file) 뿌시기
2. 변수들과 함수들은 어떻게 저장될까?
왕초보의 구조체(struct) 뿌시기
malloc 포함
한마디로 strdup은 진짜 그냥 새로운 저장 영역에 문자열을 붙여주는 것이다!
대신 malloc과 free를 이용해서 할 것!
그런데 free는 언제 가동되지? -> main 함수가 끝날 때 시킬 것!?
함수 선언 원형
#include <string.h>
char *strdup(const char *s);
!테스트 결과!
$ ./main.out
copy to safe place!
which line? : ohla Korea!
strdup : ohla Korea!
ft_strdup : ohla Korea!
각 포인터에 잘 붙었다. 그러면 메모리가 샜는지 한번 확인해 보자. 메모리 누수를 검사하는 방법은 우분투에서 valgrind를 실행해 보는 것이다.
==2860== HEAP SUMMARY:
==2860== in use at exit: 23 bytes in 2 blocks
==2860== total heap usage: 7 allocs, 5 frees, 2,194 bytes allocated #2개의 allocs은 해제되지 않았다..!
==2860==
==2860== LEAK SUMMARY:
==2860== definitely lost: 23 bytes in 2 blocks #두블럭이 새고있다.
==2860== indirectly lost: 0 bytes in 0 blocks
==2860== possibly lost: 0 bytes in 0 blocks
==2860== still reachable: 0 bytes in 0 blocks
==2860== suppressed: 0 bytes in 0 blocks
==2860== Rerun with --leak-check=full to see details of leaked memory
==2860==
==2860== Use --track-origins=yes to see where uninitialised values come from
==2860== For lists of detected and suppressed errors, rerun with: -s
==2860== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0)
이미 moulinette을 통과한 함수도 이렇게 같은 결과가 나서 찾아봤다. 많은 데이터가 없어서 외국어로 주욱 찾아봤다. 그랬더니 strdup자체가 메모리 누수가 있다고 하는데... (혹시 아시는 분 댓글 좀 부탁드려요...)
3-9. atoi
atoi란?
The atoi() function converts the initial portion of the string pointed to by nptr to int. The behavior is the same as except that atoi() does not detect errors.
atoi() 함수는 nptr로 가리키는 문자열의 초기 부분을 int로 변환합니다. 동작은 atoi()가 오류를 감지하지 않는다는 점을 제외하고 동일합니다.
atoi 함수는 nptr로 지정된 문자열을 int 형으로 변환한다. 이때 변환 범위는 숫자로 인식 가능한 선까지이다.
예를 들어 아규먼트로 "1234ab"가 주어졌다면 숫자로 인식 가능한 문자열 범위는 "1234" 이므로 1234로 변환되게 된다. 만약 변환시킬만한 적당한 문자가 존재하지 않는다면 0을 리턴한다.
반환 값 RETURN VALUE
The converted value or 0 on error.
변환된 값 또는
오류 시에는 0입니다.
함수 선언 원형
#include <stdlib.h>
int atoi(const char *nptr);
!테스트 결과!
$ ./main.out
change charater to number!
which line? : -12345
atoi : -12345
ft_atoi : -12345
$ ./main.out
change charater to number!
which line? : -+-12345
atoi : 0
ft_atoi : 0
$ ./main.out
change charater to number!
which line? : abc12345
atoi : 0
ft_atoi : 0
$ ./main.out
change charater to number!
which line? : +1234abc
atoi : 1234
ft_atoi : 1234
예전보다 코드가 더 빨리 써지는 것 같아서 너무 행복하다...! 그러면 이제 다음 함수로 총총총...
도움을 주고 싶으신 내용이나
틀린 내용이 있다면 댓글로 남겨주시고,
참고하신다면 꼭 출처를 밝혀주세요!
도움이 되었다면 공감 한 번씩 부탁드립니다❤️
728x90
'42 > libft' 카테고리의 다른 글
[42_libft] Part 2 (substr, strjoin) (0) | 2022.12.11 |
---|---|
[42_libft] Part 1 (mem 함수들) (1) | 2022.12.09 |
[42_libft] Part 1 (str 함수들2 strlcpy, strlcat) (1) | 2022.12.07 |
[42_libft] Part 1 (str 함수들1 strlen, strchr, strrchr, strncmp) (0) | 2022.12.06 |
[42_libft] Part 1 (is와 to 함수들) (1) | 2022.12.06 |
Comments