검색어 입력폼

[C언어]strfind, strcat, strcmp 구현

저작시기 2007.05 |등록일 2007.06.01 파일확장자압축파일 (zip) | 5페이지 | 가격 1,000원

소개글

#ifndef MYSTRING
#define MYSTRING
#include

#define MAX 20

int _strlen(char a[]); // 문자열 길이
int _strfind1(char a[], char b); // 원하는 문자 찾기
void _strcpy(char a[], char b[]); // 문자열 복사
void _strcat(char a[], char b[], char c[]); // 문자열 연결
int _strcmp(char a[], char b[]); // 문자열 비교
int _strfind2(char a[], char b[]); // 문자열 탐색
void _strget(char a[]); // 문자열 입력

int _strlen(char a[])
{
///////////////////////////////////////////////////////////////
/*파라미터로 받아온 문자열의 길이를 리턴하는 함수. 문자열의 끝/
/ 은 0으로 표시되므로 0을 만날때까지 길이를 센다. */
///////////////////////////////////////////////////////////////

int len = 0;

while(1){
if(a[len] == 0) break; // 문자열의 마지막을 만날때까지 while수행.

len++; // 길이를 센다.
}

return len;
}

Ⅰ. 문제의 제기
헤더 파일은 직접 정의하여 사용할 수 있으며, 이때는 를 이용해서 소스에 포함시켜 주어야 한다. 이번 리포트에서는 헤더 파일에 문자열과 관련된 함수들을 정의하고 소스 파일에서 끌어 쓰도록 프로그램을 구현한다. 헤더 파일에는 문자열에서 문자열을 검색하는 함수, 두 문자열을 비교하는 함수, 두 문자열을 연결하는 함수가 포함되어야 한다. 문자열을 검색하는 함수의 경우는 검색할 문자열을 찾아내기 위한 반복문 이용 방식을 결정하여야 하며, 문자열을 비교하는 경우는 어떤 경우들이 동일하지 않은 문자열 인지 생각해 보아야한다. 또한 문자열을 연결하는 함수는 저장할 문자열의 인덱스를 어떻게 유지해 줄지를 생각해 보아야 한다. 아래서부터 이런 문제점을 중심으로 프로그램을 구현해 본다.
※ 작성된 프로그램의 전체 소스 #붙임1 (main.cpp, myString.h)

Ⅱ. 문제해결의 방식 및 알고리즘 구현
1. 프로그램 설명
헤더 파일에 문자열에서 문자열 검색, 두 문자열 비교, 두 문자열 연결 함수를 포함시켜 프로그램을 구현한다. 또한 기존 제작한 문자열 길이, 문자열 복사, 문자 검색 함수도 헤더 파일에 선언하여 준다.

2. 문제해결 접근 방식
(1) 문자열 연결 함수의 제작 문제
두 문자열을 연결하기 위해서는 첫 문자열을 저장하고 난 후 두 번째 문자열을 저장할 때 저장되는 배열의 인덱스를 어떻게 유지할 지를 생각해야 한다. 만약 저장하는 문자열과 동일한 인덱스를 사용한다면 연결되지 않고 두 번째 문자열만 남을 것이기 때문이다. 따라서 저장 배열의 인덱스를 따로 유지해주어야 하며, 이는 새로운 카운터 변수를 선언하는 것으로 해결 할 수 있을 것이다.

(2) 문자열 비교 함수의 제작 문제
문자열을 비교하는 함수는 동일한 경우 1, 다른 경우 0을 리턴하는 방식으로 구현되어야 한다. 이때 다른 경우는 어느 때인지를 생각해야하는데, 기본적으로 다른 문자가 포함된 경우가 포함된다. 이는 두 배열의 동일 인덱스 상의 데이터를 비교하여 다른 경우 0을 리턴하는 방식으로 구현 할 수 있을 것이다. 또 하나 생각해야 하는 것은 두 문자열의 길이가 다른 경우이다. 짧은 문자열과 긴 문자열은 앞부분이 동일하고 남는 부분이 동일하지 않도록 인식되어야 한다. 따라서 다른 문자 검색이 끝난 후 두 문자열 중 하나라도 NULL에 도달하지 않았다면 0을 리턴하는 방식으로 이를 해결해야 한다. 이 두가지 경우에 해당되지 않는 경우는 1을 리턴하여 준다.

(3) 문자열을 검색하는 함수의 제작 문제
문자열에서 문자열을 검색하는 함수는 검색할 문자열을 어떻게 다룰 것인지 생각해야 한다. 우선 검색할 문자열이 기존 문자열 보다 길다면 무조건 검색 실패를 리턴한다. 그외의 경우는 기존 문자열의 인덱스를 증가시키면서 검색하면 될 것이다. 이때 검색할 문자열의 카운터는 따로 만들어야하며, 다른 문자를 만날때마다 0으로 초기화 시켜주어야 한다. 같은 문자열을 만나고 카운터를 증가한 것이 검색할 문자열의 길이와 동일하다면 검색성공을 리턴한다. 리턴은 기존 문자열에서 검색한 문자열의 시작 인덱스를 해주어야 하므로 검색할 문자열 카운터를 현재 인덱스에서 뺀 후 리턴하면 될 것이다.

3. 알고리즘 구현
(1) 문자열 연결 함수의 알고리즘
위 검토한 바에 따라 알고리즘을 작성하면 우선 두 개의 카운터가 필요할 것이며, 그중 하나는 저장할 배열의 인덱스를 제어할 것이다. 첫 문자열을 저장하고 난 후에도 저장 배열의 인덱스는 초기화 시키지 않으며 두 번째 문자열까지 저장된 후에는 0을 저장해야 할 것이다. 이와 같은 내용을 간략히 나타내면 다음과 같다.

ⅰ. cnt1, cnt2을 0으로 초기화
ⅱ. cnt1이 첫 배열의 길이보다 크거나 같을 때까지 c[cnt2]에 저장 후 cnt1, cnt2 증가
ⅲ. cnt1을 0으로 초기화
ⅳ. cnt1이 두 번째 배열의 길이보다 크거나 같을 때까지 c[cnt2]에 저장 후 cnt1, cnt2 증가
ⅴ. c[cnt2]에 0을 저장

(2) 문자열 비교 함수의 알고리즘
문자열의 비교 함수는 두 문자열의 길이를 모두 알아야 하며, 이를 lena, lenb라고 한다. 문자열 a와 b의 현재 값이 다른 경우는 0을 바로 리턴하며, 현재 인덱스가 lena 또는 lenb 보다 크거나 같아지면 반복문을 멈춘다. 반복문을 멈춘 당시 두 배열 중 하나라도 0이 아니라면 0을 리턴하고 그렇지 않으면 1을 리턴한다. 이를 간략히 나타내면 아래와 같다.
ⅰ. cnt가 lena 또는 lenb 보다 작은 경우 반복문을 계속한다.
ⅱ. a[cnt]와 b[cnt]가 다르면 0을 리턴하고, 아니면 cnt를 증가시킨 후 ⅰ로 돌아간다.
ⅲ. a[cnt], b[cnt] 중 하나라도 0이 아니라면 0을 리턴하고, 그렇지 않으면 1을 리턴한다.

(3) 문자열 검색 함수의 알고리즘
문자열 검색 알고리즘은 검색될 문자열 a와 검색할 문자열 b의 인덱스를 담당할 두 개의 카운터가 필요하다. 우선 두 문자열의 길이를 알아내어 b가 더 긴 경우는 -1을 리턴한다. 그렇지 않은 경우 반복문을 통해 검색을 하는데, 이때 cnt는 a의 인덱스로서 순차적으로 증가하며, cnt2는 b의 인덱스로서 같은 문자를 만난 경우만 증가하고 그렇지 않으면 계속해서 0으로 초기화 된다. 만약 cnt2가 b의 길이와 같아지면 검색을 성공한 것이므로 그 문자열이 포함된 인덱스를 리턴한다. 이와 같은 내용을 알고리즘으로 나타내면 아래와 같다.
ⅰ. cnt, cnt2를 0으로 초기화
ⅱ. lenb가 lena보다 길면 -1을 리턴
ⅲ. cnt가 lena 보다 작은 경우 반복문을 계속 수행
ⅳ. a[cnt]와 b[cnt2]가 다른 경우 cnt2를 0으로 초기화하고 ⅲ으로 돌아감
ⅴ. a[cnt]와 b[cnt2]가 같은 경우 cnt2를 증가하고 lenb와 같으면 cnt-cnt2+1을 리턴
ⅵ. 그렇지 않은 경우 ⅲ으로 돌아감
ⅶ. 반복문이 종료되면 -1을 리턴

컴파일 실행환경

C언어

압축파일내 파일목록

HW11.dsw
HW11.ncb
HW11.plg
main.cpp
Untitled-1 copy.jpg
myString.h
HW11.opt
HW11.dsp
string.hwp
Debug/vc60.idb
Debug/vc60.pdb
Debug/HW11.ilk
Debug/HW11.exe
Debug/HW11.pdb
Debug/HW11.pch
Debug/main.obj
다운로드 맨위로