반응형
strrchr
함수원형
char *ft_strrchr(const char *s, int c)
strrchr() 함수
s 문자열 처음부터 c와 같은 문자를 찾을 때까지 루프를 돈다.
c와 같은 문자를 찾으면 현재 s 포인터의 위치를
내부에서 임시로 저장해놓고 계속 루프를 돈다.
또 c 와 같은 문자를 찾으면 다시 임시로 저장한 후 c 와 같은 문자열이 없으면 아까 찾은 문자의 주소를 리턴한다.
이 밑에 코드는 세그먼트 fault나옴
왜 그럴까?
이미 주소값을 통해 연결된 second에 또 새로운 주소값을 연결하려고 해서 그럼
#include "libft.h"
#include <stdio.h>
char *ft_strrchr(const char *s, int c)
{
char *temp = (char *)s;
char *second = temp;
while (temp)
{
if(*temp == c)
second = temp;
temp++;
}
return (temp);
}
int main()
{
char dest[] = "abcdefgabcd";
char *first;
// char *last;
/* dest 문자열에서 첫번째 나오는 'b'문자를 찾습니다. */
first = ft_strrchr(dest, 'b');
// /* dest 문자열에서 마지막 나오는 'b'문자를 찾습니다. */
// last = strrchr(dest, 'b');
printf("first : %s \\n", first);
// printf("last : %s", last);
return 0;
}
답
예외 처리
- 확장 아스키 값이 들어오는 거 예외처리
- 널값 들어오는 부분을 처리해주어야 하는데 확장 아스키가 알아서해줌.
#include "libft.h"
size_t ft_strlen(const char *s);
char *ft_strrchr(const char *s, int c)
{
unsigned char *temp;
unsigned char ca;
int count;
temp = (unsigned char *)s;
ca = (unsigned char)c;
count = ft_strlen(s);
while (count != 0 && temp[count] != ca)
count--;
if (temp[count] == ca)
return ((char *)(temp + count));
return (0);
}
int main()
{
char dest[] = "abcdefgabcd";
char *first;
// char *last;
/* dest 문자열에서 첫번째 나오는 'b'문자를 찾습니다. */
first = ft_strrchr(dest, 'b');
// /* dest 문자열에서 마지막 나오는 'b'문자를 찾습니다. */
// last = strrchr(dest, 'b');
printf("first : %s \\n", first);
// printf("last : %s", last);
return 0;
}
참고 사이트
C 언어 문자열 검색 strchr, strrchr사용법
memchr
void *ft_memchr(const void *s, int c, size_t n)
s = 검사할 메모리 주소
c = 찾을 문자열
n = 얼만큼 찾을 지
n 수 안에서 s 배열 안에 c가 있으면 c 친구의 주소값 리턴 못 찾으면 null리턴
이 친구는 함수 안에 들어왔을 때 확장 아스키 코드값까지 고려해서 검사를 한 후 void*를 리턴해야함
#include "libft.h"
// void *ft_memchr(const void *s, int c, size_t n)
// {
// size_t i;
// unsigned char *temp;
// temp = (unsigned char *)s;
// i = 0;
// while (i < n)
// {
// if (temp[i] == (unsigned char)c)
// return ((void *)temp + i);
// i++;
// }
// return ((void *)0);
// }
void *ft_memchr(const void *s, int c, size_t n)
{
unsigned char *temp;
temp = (unsigned char *)s;
while (n--)
{
if (*temp == (unsigned char)c)
return ((void *)temp);
temp++;
}
return ((void *)0);
}
참고 사이트
memcmp
함수원형
int ft_memcmp(const void *src1, const void *src2, size_t size)
memcmp는 특정 메모리에서 원하는 크기 만큼을 비교하여 결과값을 얻어내는 함수.
src1 = 비교할 첫 번째 주소
src2 = 비교할 두 번째 주소
size = 비교할 크기
반환값 = 같으면 0, src1이 크면 1, src1이 작으면 -1
메모리를 비교해야 하는데 메모리를 비교를 우째할까
#include "libft.h"
int memcmp(const void *src1, const void *src2, size_t size)
{
unsigned char *s1;
unsigned char *s2;
size_t i;
i = 0;
s1 = (unsigned char *)src1;
s2 = (unsigned char *)src2;
while (i < size)
{
if (s1[i] != s2[i])
retrun (s1[i] - s2[i]);
i++;
}
return (0);
}
//https://minsoftk.tistory.com/30
//배열의 주소값이나 인덱스값 접근 하는 것이 메모리로 되는지 보쟈
참고 사이트
memchr, memcmp 함수 구현 (2021.01.07 업데이트)
반응형
'42Seoul > libft' 카테고리의 다른 글
libft - strdup, strlen, substr (0) | 2023.03.24 |
---|---|
libft - strnstr, atoi, calloc (0) | 2023.03.24 |
libft - toupper, tolower, strchr (0) | 2023.03.24 |
libft - strlcpy, strlcat, strncmo (0) | 2023.03.24 |
libft - bzero, memcpy, memove (0) | 2023.03.24 |