본문 바로가기

셈틀/C/C++

strstr함수 구현하기

string.h 내에 있는 strstr함수를 구현해봅시다.
문자열을 비교하는 strcmp, 문자열을 복사하는 strcpy, 문자열을 서로 붙이는 strcat등 많은 함수가 있지만 여기서는 제게 있어서 구현하기 까다로웠던 strstr을 strlen(문자열의 길이를 구하는 함수)과 함께 구현해 보겠습니다. 기껏 만들었더니 나는 30줄, 누구는 20줄이어서 다시 참고해서 만들었습니다...-ㅅ-

#include <stdio.h>
#include <stdlib.h>/*	system	*/

char *my_strstr(const char *s1, const char *s2);//strstr 구현함수
int my_strlen(const char *s1);//strlen 구현함수

int main()
{
	char *ptr;
	char str1[50]="Sinsa Soharang..http://e-sinsa.com";//검색대상이 되는 문자열
	char str2[20];//검색어를 저장할 배열
	do{
		system("cls");
		printf("------------------------------------------------\n");
		printf("Str1: %s\n", str1);
		printf("------------------------------------------------\n");
		printf("String to find ('q' to exit): ");
		gets(str2);

		//검색을 마치고 검색에 성공하면 검색된 문자열의 첫 주소를, 
		//실패하면 NULL을 ptr에 리턴
		ptr=my_strstr(str1, str2); 
		printf("\n");
		
		if(ptr){//검색에 성공했으면
			printf("Found : %s\n", ptr);//검색어를 포함, 이후의 문자열을 출력
			system("pause");
		}
		else{//실패하면..
			printf("Not found.\n");//메시지 출력
			system("pause");
		}
		printf("\n");
	}while(*str2 != 'q');//q가 입력되지 않는 이상 무한 반복
	
	return 0;
}

//문자열의 길이를 리턴하는 함수
int my_strlen(const char *s1){
	int i;
	for(i=0;*s1;s1++, i++);//*s1의 값이 NULL(끝)이 될 때까지 i를 증가
	return i;
}

//문자열을 검색하는 함수
//s1: 검색대상이 되는 문자열		s2:검색어가 되는 문자열
char *my_strstr(const char *s1, const char *s2){
	int i; //s1과 s2를 비교할 때 서로 같은 문자열의 개수를 저장할 변수

	if(*s2=='\0')//그냥 리턴이 입력되면..
		return (char *)s1;//소스가 되는 s1을 그대로 리턴

	else{
		for(;*s1;s1++){//검색대상의 끝까지..
			if(*s1==*s2){//검색어의 첫글자와 검색대상의 문자가 서로 같으면

				//검색대상과 검색어가 일치하는 길이 만큼 i증가
				for(i=1;*(s1+i)==*(s2+i);i++);
				
				if(i==my_strlen(s2))//i와 검색어의 길이가 같으면
					return (char *)s1;//현재의 s1주소값을 리턴
			}
		}
		return NULL;//일치하는 것이 없으면 NULL 반환
	}
}


결과>

사용자 삽입 이미지



사용자 삽입 이미지



사용자 삽입 이미지



사용자 삽입 이미지


 
참고자료: by_lazy(blog)

'셈틀 > C/C++' 카테고리의 다른 글

해결  (0) 2008.11.17
Cprogramming.com  (0) 2008.11.10
최대공약수(GCD)와 최소공배수(LCM) 구하기  (4) 2008.11.07
비트연산을 이용한 한달 출석부 관리 프로그램  (2) 2008.10.17
10진수를 BCD코드로 출력  (10) 2008.10.16