본문 바로가기
C & C++/C & C++

string.h에 있는 함수들에 대한 설명

by izen8 2009. 12. 18.
반응형
1. strcpy(...)
  원형( prototype ) :
      char *strcpy(char *dest, const char *src);

  설명 : src가 지시하는 문자열을 dest라는 포인터가 지시하는 공간에 복사하고
              그 결과 문자열 dest을 리턴합니다..

  예 : char newstr[32];
          char oldstr[] = "coffee";
          strcpy( newstr, oldstr );


  결과 : newstr -> "coffee"

2. strcat(...)
   원형( prototype )
      char *strcat(char *dest, const char *src);

  설명 : src가 지시하는 문자열(src 문자열 )을 dest가 지시하는 문자열의
              끝에 덧 붙이고 결과를 리턴합니다.

  예 : char str1[] = "abc";
          char str2[] = "def";
          strcat( str1, str2 );


  결과 : str1 -> "abcdef"

3. strcmp(..)
  원형( prototype)
      int strcmp(const char *s1, const char *s2);

  설명 : 문자열 s1과 s2를 사전식( 오름차순 )으로 비교하여 결과를 리턴합니다.
  예 : char str1[] = "big";
         char str2[] = "bigger";
         int result;
         result = strcmp( str1, str2 );

         result 가 0 이면 str1과 str2가 같은 문자열
         result가 양수이면 str1이 str2보다 크다 ( str1이 str2의 뒤에 위치 )
         result가 음수이면 str1이 str2보다 작다 ( str1이 str2보다 앞선다 )

        "big"과 "bigger"의 비교
         "big"  "bigger"
         'b'        'b'
         'i'          'i'
         'g'        'g'
        '\0'        'g'

        최초로 일치하지 아니하는 문자의 차(difference)를 strcmp의 결과로 리턴합니다.
        '\0' - 'g' => 0 - 103 = -103를 리턴
*/


#include <stdio.h>
#include <stdlib.h>

/*
사용자가 정의함수( user defined function )
함수의 원형( 프로토 타입 = prototype )을 선언합니다.


표준함수와 구별하기 위하여 앞에 "my"라는 접두어를 붙였습니다.
파라메타의 형에 const라는 modifier(수정자)를 붙인 것은 함수를 정의할 때
문자열을 수정하지 않는다는 의미입니다. */


/* 문자열 복사함수 */
char* mystrcpy( char* dest, const char* src );

/* 문자열 덧붙이기 함수 */
char* mystrcat( char* dest, const char* src );

/* 문자열 비교함수 */
int mystrcmp( const char* s1, const char* s2 );

int main(void)
{
   /* 두개의 문자배열을 선언 */
   char first[255], second[255], copy[255];
   int query, result;

   printf( "두개의 문자열을 입력하여 \n함수 mystrcat(..과 mystrcmp(..를 테스트합니다.\n" );
   while( 1 )
   {
      printf( "\n첫번째 문자열 >> " );
      scanf( "%s", first );
      fflush( stdin );

      printf( "두번째 문자열 >> " );
      scanf( "%s", second );
      fflush( stdin );

      /* 복사 테스트 - mystrcpy */
      mystrcpy( copy, first );
      printf( "복사된 첫번째 문자열은 %s입니다.\n", first );
      mystrcpy( copy, second );
      printf( "복사된 두번째 문자열은 %s입니다.\n", second );
      system( "pause" );

      /* 비교 테스트 - mystrcmp */
      result = mystrcmp( first, second );
      printf( "\n" );
      if( result == 0 )
        printf( "두 문자열 %s와 %s는 같은 문자열입니다\n", first, second );
      else if( result < 0 )
        printf( "문자열 %s는 문자열 %s보다 앞 섭니다\n", first, second );
      else
        printf( "문자열 %s는 문자열 %s의 뒤에 위치합니다\n", first, second );
      system( "pause" );

      /* 덧붙이기 테스트  - mystrcat */
      printf( "\n문자열 %s에 ", first );
      mystrcat( first, second );
      printf( "%s를 덧 붙이면 문자열 %s가 생성됩니다.\n", second, first );

      printf( "\n종료하시려면 'Q'나 'q'를 계속하시려면 그 밖의 아무 키나 누르세요 >> " );
      query = getchar();

      if( query == (int)'Q' || query == (int)'q' )
      {
         printf( "프로그램을 종료합니다\n" );
         break;
      }
   }
   return 0;
}

char* mystrcpy( char* dest, const char* src )
{
     int i = 0, j = 0;

       
/*
      src 문자열의 요소문자(src[i])가
      끝의 널문자('\0')에 도달하지 아니한 동안 복사합니다.*/

      while( src[i] != '\0' )
          dest[j++] = src[i++];
      dest[j] = '\0';

      return dest;

       
/*
       // 보다 빠른 소스
       // dest라는 포인터는 유지하고
       // p에 dest를 저장한 후 p를 이동하면서 조작

       char* p = dest;
       while( *src )
           *p++ = *src++;
       *p = '\0';

       return dest;
     */

}

char* mystrcat( char* dest, const char* src )
{
   int i = 0, j = 0;
   char* p = dest;

   while( p[i] != '\0' ) i++;
   while( src[j] != '\0' )
      p[i++] = src[j++];
   p[i] = '\0';

   return dest;

  
/*
  // 보다 빠른 소스
  // dest라는 포인터는 유지하고
  // p에 dest를 저장한 후 p를 이동하면서 조작


  char* p = dest;


  /* 포인터를 문자열 dest의 끝으로 이동시킵니다. */
  while( *p ) p++;
  while( *src )
          *p++ = *src++;
  *p = '\0';

  return dest;
  */
}

int mystrcmp( const char* s1, const char* s2 )
{
   
/*
   s1이 지시하는 문자가 널문자가 아닌 동안 비교
   s2가 지시하는 문자가 널문자인 경우는 아래 if문에서 catch됩니다. */


   while( *s1 )
   {
      if( *s1 != *s2 )
         break;
      s1++;
      s2++;
   }
   return (*s1 - *s2);
}
반응형

'C & C++ > C & C++' 카테고리의 다른 글

rand() 함수  (0) 2010.04.26
문장에서 문자수 계산하는 프로그램  (0) 2009.12.18
stdafx.h  (0) 2009.12.18
(교재) C 예제들  (0) 2009.10.31
(교재) 열혈강의 C  (0) 2009.10.31

댓글