728x90
반응형
strchr 함수
- string.h 헤더파일에 들어있는 함수
- 원형은 char *strchr(const char *s, int c)을 따른다.
- 가르키는 문자열 s에서 c가 있는지를 찾는 함수이다. 이는 '\0'문자를 문자열의 일주로 간주한다.
- 만약 찾는 경우 찾은 문자에 대한 포인터를 반환하고, 문자가 없는 경우 null을 반환
의문점1
원형매개변수에 const가 들어가는데 이를 그대로 활용하여 return 하고자하면 const빼려고 한다는 오류가 발생한다. 그냥 다른 변수에 옮기려고 해도 마찬가지. 이유는 const를 사용한 이상 리턴도 const를 붙여주어야하는데 c에서는 그게 어렵다고 한다. 프로토타입상에서는 s라는 문자열을 건들면 안되니까 const를 써줘야하는데 return이 따라오지 않으니까 생기는 의문점인듯.
참고로 char * -> const char *는 암시적 형변환이 가능한데, const char * -> char 는 명시적 형변환이 필요해서 다른 변수로 옮겨담을 때 명시적으로 형을 바꾸면 해결된다.
의문점2
'\0'을 찾을 때와 문자가 없을떄는 어떻게 다른가? 바로 '\0'을 찾을 때는 s의 '\0'이 있는 주소를 반환하는 것이고 문자가 없을때는 null인 메모리를 반환하는 것이다. 증거로 원본 함수를 출력해봤을때 전자는 아무것도 출력되지않고(보이는 것 상으로), 후자는 null인 메모리에 접근 할때 나는 segmentation fault 가 나는 것을 볼 수 있다.
strchr 함수의 구현
char *ft_strchr(const char *s, int c)
{
int i;
char *tmp;
i = 0;
c = c % 256;
tmp = (char *)s;
while (tmp[i] != '\0')
{
if (tmp[i] == c)
return (&tmp[i]);
i++;
}
if (c == '\0')
return (&tmp[i]);
return (0);
}
#include <string.h>
#include <stdio.h>
int main(void)
{
char *str1 = "starComputer00";
char c1 = 'a';//있는거
printf("test1 : strchr_lct :%p" , strchr(str1, c1));
printf("\ntest1 : strchr :%c" , *(strchr(str1, c1)));
printf("\ntest1 : ft_strchr_lct :%p" , ft_strchr(str1, c1));
printf("\ntest1 : ft_strchr :%c" , *(ft_strchr(str1, c1 )));
printf("\n");
char c2 = '\0';//'\0'
printf("\ntest2 : strchr_lct :%p" , strchr(str1, c2));
printf("\ntest2 : strchr :%c" , *(strchr(str1, c2)));
printf("\ntest2 : ft_strchr_lct :%p" , ft_strchr(str1, c2));
printf("\ntest2 : ft_strchr :%c" , *(ft_strchr(str1, c2)));
printf("\n");
char c3 = 'S';//없는거
printf("\ntest3 : strchr_lct :%p" , strchr(str1, c3));
printf("\ntest3 : strchr :%c" , *(strchr(str1, c3)));
printf("\ntest3 : ft_strchr_lct :%p" , ft_strchr(str1, c3));
printf("\ntest3 : ft_strchr :%c" , *(ft_strchr(str1, c3)));
}
728x90
반응형
'C' 카테고리의 다른 글
strncmp 함수의 구현 (2) | 2023.10.16 |
---|---|
strrchr 함수의 구현 (0) | 2023.10.16 |
tolower 함수의 구현 (2) | 2023.10.16 |
toupper 함수의 구현 (0) | 2023.10.16 |
확장아스키코드와 맥과 윈도우 사이의 운영체계 문자표 (0) | 2023.10.16 |