K&R

  • Copyright (c) 2015-, All Rights Reserved by Kwanghoon Choi

(아래 강의 노트를 자유롭게 이용하되 다른 웹 사이트 등을 통한 배포를 금합니다.)

The C Programming Language 2nd Ed. by Kerninghan & Ritchie ( Ch.3, expand )

앞에서 분석한 expand 함수에서 고려해야할 모든 경우의 수를 C코드로 옮겨보면 아래와 같다.

#define EMPTY 1
#define ALPHA 2
#define DIGIT 3
#define ALPHA_HYPHEN 4
#define DIGIT_HYPHEN 5

void expand(char s1[], char s2[]) {

   int state;
   int c0;    // state가 ALPHA, DIGIT, ALPHA_HYPHEN, DIGIT_HYPHEN일 때 문자를 포함
   int c;

   int i;
   int j;

   state = EMPTY;  // 처음에는 EMPTY부터 시작
   i = 0;  // 문자열 s1의 첨자
   j = 0;  // 문자열 s2의 첨자 

   c = s1[ i ];
   while ( c != '\0' ) {

     switch ( state ) {
       case EMPTY:
            if (c == '\0') {  // 불필요한 코드 : while의 c != '\0' 조건 때문에 항상 false
               s2[j] = '\0';  
               j++;
            }
            else if ( 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' ) {
               state = ALPHA;
               c0 = c;
            }
            else if ( '0' <= c && c <= '9' ) {
               state = DIGIT;
               c0 = c;
            }
            else {
               state = EMPTY; // 불필요한 코드
               s2[j] = c;
               j++;
            }
          break;
       case ALPHA:
          // 코드 추가
          break;
       case DIGIT:
          // 코드 추가
          break;
       case ALPHA_HYPHEN:
          // 코드 추가
          break;
       case DIGIT_HYPHEN:
          // 코드 추가
          break;
     }

     i++;  // s1의 그 다음 문자
     c = s1[ i ];

   }

   switch ( state ) {
      case EMPTY:
         s2[ j ] = '\0';
         j++;
         break;
      case ALPHA:
      case DIGIT:
         s2[ j ] = c0;
         s2[ j+1 ] = '\0';
         j = j + 2;
         break;
      case ALPHA_HYPHEN:
      case DIGIT_HYPHEN:
         s2[ j ] = c0;
         s2[ j+1 ] = '-';
         s2[ j+2 ] = '\0';
         j = j + 3;
         break;
   }
}