토큰(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 배열에 저장하거나 계산에 사용한다.
'C 언어' 카테고리의 다른 글
2차원 배열 동적 할당 시 해제 (0) | 2024.04.28 |
---|---|
공백 문자열과 빈 공간 문자열의 차이 (1) | 2024.04.22 |
문자를 숫자로 변환하기 (0) | 2024.04.20 |
2차원 배열 메모리 할당과 포인터 (0) | 2024.04.10 |
타입 캐스팅(Type Casting)과 역참조(Dereferencing) (0) | 2024.04.06 |