상세 컨텐츠

본문 제목

문자열 검색하기

IT 세상

by 이현민 (지후지율아빠) 2007. 12. 27. 16:53

본문

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


#define MAX_LEN    20  /* 입력문자열의 최대 길이 */
#define MAX_LINE   255 /* 레코드화일에서 레코드가 기록되어 있는 라인의 최대길이 */


int main( int narg, char* argc[] ){
 /*
   lnstr  : 라인문자들을 저장하는 문자열, skstr : 검색할 문자열
   delims : 레코드 사이의 분리자가 아래 delims라는 분리 문자열들 중의 어느하나라고
    가정,  ' ,'(콤마), ' '(공백 : SPACE), '\r'(CR : CARRAGE RETURN), '\n'(LF : LINEFEED )
   record : 분리자에 의하여 분리된 문자열로서 여기서는 레코드로 간주합니다.   */


 char lnstr[MAX_LINE], skstr[MAX_LEN], delims[] = ", \r\n";
 char* record;


 FILE* ifs;                              /* 입력화일 스트림 */
 int found = 0, irecord = 0;   /* 발견된 레코드수, 레코드의 인덱스 */


 if( narg < 2 ){
   printf( "레코드 화일이름이 입력되지 아니하였습니다.\n" );
   getch();
   return 0;
 }
 else if( narg > 2 ){
   printf( "명령라인에 너무 많은 파라메타가 전달되었습니다.\n" );
   getch();
   return 0;
 }


 /* 문자열 검색이므로 화일을 TEXT 모드로 읽기 위하여 개방합니다 */
 ifs = fopen( argc[1], "rt" );
  if( ifs == NULL ){
  printf( "%s라는 화일을 열수가 없습니다.\n", argc[1] );
  getch();
  return 0;
 }

 printf( "검색할 문자열을 입력하십시오. \n" );
 scanf( "%20s", skstr );


 /* 화일의 끝이 아니면  각 라인을 읽고 라인을 분리자들로 분리하여 레코드들을
    추출하고  검색문자와 동일한지 비교합니다.. */

 while( feof( ifs ) == 0 ){
   if( fgets( lnstr, MAX_LINE, ifs ) && strcmp( lnstr, "") ){
     record = _fstrtok( lnstr, delims );


     while( record && strcmp( record, "" ) ){
        irecord++;
        /* record가 검색어 skstr과 일치하면 그 위치를 출력 합니다. */
        if(  strcmp(  skstr, record  )  ==  0  ){
          printf( "%d\n", irecord );
          found++;
        }
        record = _fstrtok( NULL, delims );
     }
   }
 }


 /* 발견된 레코드가 없으면 0을 출력합니다. */

 if( found == 0 )
   printf( "%d", found );


 getch();          /* 화면을 닫기 전에 키 입력이 있을 때 까지 결과를 살핀다. */
 fclose( ifs );   /* 화일을 닫는다. */
 return 1;
}

반응형

관련글 더보기