본문 바로가기

프로그래밍/C

[library] strchr 구현하기

📌 매뉴얼 (Linux)

더보기

NAME
       strchr - locate character in string
: 문자열에서 문자를 찾기


SYNOPSIS
       #include <string.h>
       char *strchr(const char *s, int c);

DESCRIPTION
       The  strchr()  function  returns  a  pointer to the first occurrence of the character c in the
       string s.
       Here "character" means "byte"; these functions do not work with wide or multibyte characters.

: strchr() 함수는 문자열에서 문자 c의 첫 번째 발생에 대한 포인터를 반환한다.
여기서 문자(character)는 바이트(byte)를 의미한다.

이러한 기능은 넓은 문자나 여러 바이트 문자에서는 작동하지 않는다.


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'으로 지정되면 이 함수는 종결 부분으로 포인터를 반환한다.

 

📌 작성 코드

char	*do_strchr(const char *s, int c)
{
	int	i;

	i = 0;
	while (s[i] != '\0')
	{
		if (s[i] == c)
			return ((char *)s + i);
		i ++;
	}
	if (c == '\0')
		return ((char *)s + i);
	return (0);
}

 

📌 코드 리뷰

strchr은 int c 매개변수로 받은 값과 동일한 문자를 찾으면 해당 위치의 주소를 반환하는 함수이다.

인덱스인 i를 만들고, 이를 이용해 s[i]가 \0이 아닌 동안 s[i]가 c와 같은지 if문을 반복한다. 만약 c를 찾게 되면,

해당 위치를 반환하는데, s는 문자열의 첫번째 주소를 가리키고 있으므로, 추가되어진 인덱스인 i를 더하여 return한다.

그렇게 모두 반복문을 돌았는데도 찾지 못한다면, 0을 반환하게 되고,

만약, c 가 \0이라면 예외적으로 문자열 마지막 위치의 다음을 반환해야한다. 해당 부분이 \0이 있는 종결 위치이기 때문이다.

그러려면 while문이 다 돌고나서 s에 끝까지 반복한 인덱스 i를 추가해주면 \0를 가리키고 있는 포인터가

s + i 에 있고 이를 반환한다.

 

추가적으로 return 값들에 (char *)을 명시적 캐스팅해주어 반환한다는 점이 중요하다.

캐스팅 하지 않으면, return discards ‘const’ qualifier from pointer target type 라는 warning 문구가 나오는데, 

이는 strchr 함수의 반환값이 (char *) 이므로, const가 사라진 것에 대한 경고를 주는 것이다.

캐스팅하지 않아도 결과는 같지만, const로 된 것을 함수에서 반환할 때는 return 자료형에 맞춰 캐스팅한 뒤 반환해주어야 한다.

'프로그래밍 > C' 카테고리의 다른 글

[library] strrchr 구현하기  (0) 2024.04.16
[study] 가변인자 (variable argument)  (0) 2024.04.03
[library] strlcat 구현하기  (2) 2024.03.19
[library] strlcpy 구현하기  (0) 2024.03.19
[library] strlen 구현하기  (0) 2024.03.18
Recent Posts
Popular Posts
Recent Comments