- 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;
}
}