본문 바로가기

C 언어

토큰(token): 문자열이나 코드를 구성하는 작은 단위

토큰(token)은 프로그래밍에서 문자열이나 코드를 구성하는 더 작은 단위를 의미한다.

토큰은 일반적으로 데이터 처리 과정에서 문자열을 더 관리하기 쉽고 의미 있는 부분으로 나누기 위해 사용된다. 

예를 들어, 텍스트 데이터를 처리할 때, 문자열을 공백이나 특정 구분자로 나누어 각각의 단어나 요소를 별도로 처리할 수 있는데 이렇게 나누어진 각각의 부분을 "토큰"이라고 부른다. 

C 언어에서 strtok 함수를 사용하여 문자열을 토큰으로 나누는 예시를 들어볼 수 있다. strtok 함수는 문자열에서 지정된 구분자를 기준으로 토큰을 추출한다. 예를 들어, 다음과 같은 문자열이 있을 때

char str[] = "Hello, world! Welcome to C programming.";

 

이 문자열을 공백(' ')을 구분자로 사용해 토큰으로 나누면, 각 단어 "Hello,", "world!", "Welcome", "to", "C", "programming." 각각이 토큰이 된다. 

 

심화 예제

문자열 배열 s 에서 Z 앞 숫자는 빼고 나머지 숫자만 더해서 출력하는 코드 from 프로그래머스 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h> // strlen과 strcpy를 사용하기 위해 추가

int solution(const char* s) {
    int answer = 0;
    int len = strlen(s);
    int* num = (int*)malloc(sizeof(int) * len);
    if (num == NULL) {
        return -1; // 메모리 할당 실패 시 오류 처리
    }
    int n = 0;

    // s를 변경할 수 있는 복사본 생성
    char* copy = (char*)malloc(len + 1); // 널 문자를 위한 공간 추가
    if (copy == NULL) {
        free(num);
        return -1; // 메모리 할당 실패 시 오류 처리
    }
    strcpy(copy, s);

    char* p = strtok(copy, " ");
    while (p != NULL) {
        if (*p == 'Z') {
            if (n > 0) { // n이 0보다 클 때만 실행
                answer -= num[--n];
            }
        } else {
            num[n] = atoi(p);
            answer += num[n++];
        }
        p = strtok(NULL, " ");
    }

    free(copy); // 복사된 문자열 메모리 해제
    free(num); // 동적 할당된 메모리 해제
    return answer;
}

int main(void){

  	const char* s = "10Z20Z1";
  	int result = solution(s);

  	if(result != NULL){
    	prinf("%d", result);
    	free{result);
  	} 

  	else {
   		printf("메모리 할당 실패!");
  	}
  	return 0;
 	}
}

 

<strtok의 작동 원리> 

1. 문자열 분리: strtok 함수를 사용하여 s 문자열을 공백(' ')을 기준으로 문자들을 솎아낸다. 이 함수는 호출될 때마다 문자열에서 다음 토큰을 찾아 포인터를 반환하고, 더 이상 토큰이 없으면 NULL을 반환한다. 
2. 문자열에서 정수로 변환: 분리된 토큰(p)이 숫자를 나타내는 문자열이라면, atoi (아스키 -> 정수) 함수를 사용하여 이 문자열을 정수(int)로 변환한다. atoi는 문자열을 숫자로 변환하는 표준 라이브러리 함수이다. 
3. 배열에 저장: 변환된 정수는 num 배열의 n번 인덱스에 저장된다. n은 num 배열에 저장된 요소의 수를 추적한다. 새로운 숫자가 추가될 때마다 n은 증가한다. 

예를 들어, s가 "12 3 25 Z 6"인 경우:

(1) 첫 번째 호출에서 strtok(s, " ")은 "12"를 반환하고, atoi("12")는 12를 반환한다. 
(2) 12는 num[0]에 저장된다. 
(3) 다음 strtok 호출은 "3", "25", "Z", "6"을 순차적으로 반환하며 각각을 적절히 처리하여 num 배열에 저장하거나 계산에 사용한다.