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사용법
C 언어 문자열 검색 strchr, strrchr사용법
문자열 char*, char[] 타입에서 검색 문자를 지정해 검색하는 방법을 알아보겠습니다. 문자 검색을 하기 위해서는 strchr 함수를 사용합니다. 사용법 char *strchr(const char *s, int c); char *strrchr(const char *s,
codingcollection.tistory.com
[C]strchr & strrchr
strchr함수는 문자열에서 찾고자하는 문자를 앞에서부터 찾는 함수입니다. strrchr함수는 문자열에서 찾고자하는 문자를 뒤에서부터 찾는 함수입니다. 1️⃣ 함수원형 < strchr > char *strchr(const char *st
kirkim.github.io
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);
}
참고 사이트
C언어 memchr 함수 메모리에서 문자 검색
C memchr() 메모리에서 문자 검색 함수 C언어 메모리 관련 함수 memchr()은 메모리 영역에서 임의의 문자를 검색하고 있으면 그 위치의 포인터를 구합니다. 헤더: string.h 형태: void *memchr(const void *s, int
badayak.com
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
//배열의 주소값이나 인덱스값 접근 하는 것이 메모리로 되는지 보쟈
참고 사이트
C언어 메모리 조작(memset, memcmp)
* C에서 메모리를 조작하는 함수로는 대표적으로 memset(), memcpy(), memmove(), memcmp() 등이 ...
blog.naver.com
memchr, memcmp 함수 구현 (2021.01.07 업데이트)
memchr, memcmp 함수 구현 (2021.01.07 업데이트)
틀린 내용이나 지식이 있다면 댓글로 알려주세요! 감사합니다! 2021.01.03 내용 수정 2021.01.07 내용 업데이트 💡 memchr에 대하여 환경 c, c++ C에서는 C++에서는 Prototype void *ft_memchr(const void * ptr, int value
minsoftk.tistory.com
'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 |