일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- shell_script
- PHP #핵심정리
- C++ 언어 #핵심정리
- MySQL #핵심정리
- C++ 언어 # 핵심 정리
- C언어 # 부록
- Hacking #Baic
- C언어 # 핵심 정리
- HTML #핵심정리
- C++ 언어 # 핵심정리
- Bandit
- C언어 #핵심정리
- C언어 #부록
- Today
- Total
cCcode
C Language [핵심정리] - 23 본문
1. 문자열 자르기
특정 문자를 기준으로 문자열을 자르고 싶다면 strtok 함수를 사용합니다. 함수명은 문자열은 조각(token)으로 나누다(string tokenize)에서 가져왔습니다. (<string.h>파일에 선언되어 있습니다.)
음.. strchr 함수와는 좀 다르죠? 함수 흐름을 간단히 설명드리자면 다음과 같습니다.
우선 첫 번째 strtok 함수는 문장에서 구분자로 들어온 " " 즉, 공백을 찾습니다. 공백에 해당하는 부분을 찾게 되면 해당 부분을 문자열의 끝을 의미하는 널문자로 바꿔줍니다. 따라서 strtok의 첫 번째 반환 값은 'C'가 됩니다. 이 상태에서 다시 strtok(NULL, " ") 형태로 함수를 호출하면 NULL부터 시작하여 또 다른 구분자를 찾게 됩니다.따라서 이 경우에는 "Language"의 포인터를 반환하게 되겠네요. 이 동작을 다른 구분자가 나오지 않아 포인터로 NULL이 반환될 때까지 반복합니다.
이제 어느정도 이해가 되셨나요? 여기서 핵심은 두 번째 인자로 들어온 구분자를 널문자로 바꿔준다는 사실입니다.
우리는 이를 이용해 문자열에서 띄어쓰기 같은 특정 구분자를 제외한 단어들을 가지고 올 수 있습니다.
이번에는 배열이 아닌 포인터를 사용해보겠습니다.
읽기 전용인 상태로는 strtok 함수를 사용할 수 없습니다. 따라서 문자열 포인터에 문자열 literal을 할당하는 대신 동적 메모리를 할당하고 문자열을 복사하면 문제를 해결할 수 있습니다.
지금까지는 자른 문자열을 출력만 하고 끝냈습니다. 그런데 과연 실제 프로그래밍에서 출력만 하고 끝나는 경우가 대부분일까요? 당연히 아니죠. 문자열을 자른 뒤 다른 코드를 실행하거나 자른 문자열을 다시 사용한다든지 여러가지 처리를 해야하는 경우가 생깁니다. 그럼 while 반복문 안에서 모든 처리를 끝낼 수 없기에 자른 문자열을 보관해야 합니다.
1) 배열에 자른 문자열 보관
strtok 함수 사용법은 전과 모두 동일합니다. 다만, 문자열을 자른 뒤 반환되는 메모리 주소를 저장할 포인터 배열을 선언한 후 while 반복문에서 문자열을 자르는 순간마다 반환되는 주소를 i 변수를 이용해 인덱스 값을 1씩 증가시키며 저장합니다. 모두 저장한 후에는 if 분기문으로 배열의 요소가 NULL이 아닐 때만 출력합니다.
2) 포인터에 자른 문자열 보관
포인터 부분은 동적할당해 포인터를 배열형태로 선언해주는 걸 제외하면 배열로 자른 문자열을 보관하는 방법과 완전히 동일합니다. 따라서 s1 즉, 문자열이 할당된 변수만 선언방식을 수정해주면 됩니다.
+ strtok_s 함수
strtok_s 함수에는 마지막에 새로운 매개변수가 들어가는데 이때 해당 매개변수에는 분리된 후 남은 문자열이 들어갑니다.
'C Language Basic' 카테고리의 다른 글
C Language [핵심정리] - 25 (0) | 2021.06.08 |
---|---|
C Language [핵심정리] - 24 (0) | 2021.06.06 |
C Language [핵심정리] - 22 (0) | 2021.06.02 |
C Language [핵심정리] - 21 (0) | 2021.06.01 |
C Language [핵심정리] - 20 (0) | 2021.05.30 |