C Language Basic

C Language [핵심정리] - 22

cCcode 2021. 6. 2. 00:32

1. 문자열 검색하기

문자열에서 특정한 문자검색하기 위해선 strchr 함수를 사용해야 합니다. 함수명은 (string character)에서 가져왔습니다. (<string.h>파일에 선언되어 있습니다.)

strchr 함수 사용하기
strchr 함수 사용
결과

코드가 어떻게 동작하는 지 간단하게 순서도정리해볼게요.

1) strchr 함수를 사용해서 strchr 함수가 문자열 'Garden of god' 에서 문자 'g'를 찾아 'g'포인터를 반환하면 그 포인터Ptr 포인터 변수에 저장합니다.

2) while (Ptr != NULL) 즉, 'g'라는 문자가 나오지 않을때까지 계속 반복

3) Ptr = strchr(Ptr + 1, 'g') 현재 Ptr에는 'g'부터 시작하는 문자열의 포인터저장되어 있습니다. 그런데 여기서 Ptr 에 + 1 을 하면 다음 문자열로 넘어갑니다. 위 문자열에서는 'o'가 되겠네요. 그래서 'g'가 다시 나올 때까지 1씩 더하는 연산반복합니다.

 

하지만 제 문자열에는 'god' 에서 'g' 뒤에는 다른 'g'가 나오지 않아 NULL을 반환합니다. 그래서 반복문을 탈출하며 프로그램이 종료되는거죠.

 

strchr 함수문자열의 처음부터 문자를 검색해서 반환하는 반면 strrchr 이라는 함수는 문자열의 끝에서부터 문자를 검색하며, 함수명은 문자열을 오른쪽부터 문자를 찾아라(string (find from the right) character)에서 가져왔습니다. (<string.h>파일에 선언되어 있습니다.)

strrchr 함수 사용
strrchr 함수 사용
결과

strrchr 함수는 그저 strchr 함수의 동작을 역으로 수행한 것일 뿐입니다.

 

이전까지 문자열 안에서 특정 문자를 검색했다면 이번엔 특정 문자열을 검색해보겠습니다. 이 경우에는 strstr 함수를 사용하고 함수명은 string(find)string 에서 가져왔습니다. (<string.h>파일에 선언되어 있습니다.)

strstr 함수 사용

일반적으로는 문자보단 문자열을 찾는 함수인 strstr함수를 더 자주 사용합니다.

결과

strstr 함수는 대소문자구분하며, strchr 함수처럼 while 반복문을 통해 문자열을 계속 검색할 수 있습니다.

 

 

+ 제가 만든 소스코드

여러분들의 이해를 위해 인용문에서 특정 단어를 검색하고 그 개수 위치를 표시해주는 프로그램을 만들었습니다. 시간이 없어 완성도에서 떨어진다는 점 양해해주세요.

#include <stdio.h>
#include <string.h>
#include <Windows.h>

int main()
{
	printf("인용문에서 특정 문자 찾는 프로그램\n\n");
	printf("인용문 - I never dreamed about success, I worked for it.\n" 
			"         (나는 절대 성공에 대해 꿈꾸지 않았다, 나는 꿈을 위해 행동했다.)  -Estee Lauder\n\n");
	
	char input;
	int character_count = 0;
	printf("위의 인용문에서 찾고싶은 문자(알파벳)를 입력해주세요.\n");
	printf("입력 : ");
	scanf_s("%c", &input, (unsigned char)sizeof(input));

	char English_Quote[100] = { "I never dreamed about success, I worked for it." };
	char* Ptr = strchr(English_Quote, input);

	int index_check[100] = { 0, };
	int check_index = 0;
	int i = 0;
	while (1)
	{
		if (English_Quote[i] == input)
		{
			index_check[check_index] = i;
			check_index += 1;
		}
		if (i == 49) break;
		i += 1;
	}

	while (Ptr != NULL)
	{
		Ptr = strchr(Ptr + 1, input);
		character_count += 1;
	}

	printf("\n");
	int j = 0;
	for (i = 0; i < 100; i++)
	{
		if (i == index_check[j])
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
			printf("%c", English_Quote[i]);
			j += 1;
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
		}
		else
			printf("%c", English_Quote[i]);
	}
	printf("\n현재 인용문에는 총 %d개의 \'%c\'가 존재합니다.\n", character_count, input);

	return 0;
}

결과