cCcode

C Language [핵심정리] - 23 본문

C Language Basic

C Language [핵심정리] - 23

cCcode 2021. 6. 4. 00:46

1. 문자열 자르기

특정 문자를 기준으로 문자열을 자르고 싶다면 strtok 함수를 사용합니다. 함수명은 문자열조각(token)으로 나누다(string tokenize)에서 가져왔습니다. (<string.h>파일에 선언되어 있습니다.)

strtok 함수 사용
strtok 함수 사용
결과

음.. strchr 함수와는 좀 다르죠? 함수 흐름을 간단히 설명드리자면 다음과 같습니다.

우선 첫 번째 strtok 함수는 문장에서 구분자로 들어온 " " 즉, 공백을 찾습니다. 공백에 해당하는 부분을 찾게 되면 해당 부분을 문자열의 끝을 의미하는 널문자로 바꿔줍니다. 따라서 strtok의 첫 번째 반환 값은 'C'가 됩니다. 이 상태에서 다시 strtok(NULL, " ") 형태로 함수를 호출하면 NULL부터 시작하여 또 다른 구분자를 찾게 됩니다.따라서 이 경우에는 "Language"포인터를 반환하게 되겠네요. 이 동작을 다른 구분자가 나오지 않아 포인터로 NULL이 반환될 때까지 반복합니다.

 

첫 번째 strtok 함수 사용
두 번째 strtok 함수 사용 
세 번째 strtok 함수 사용
마지막 strtok 함수 사용

이제 어느정도 이해가 되셨나요? 여기서 핵심은 두 번째 인자로 들어온 구분자널문자로 바꿔준다는 사실입니다.

 

예제
결과

우리는 이를 이용해 문자열에서 띄어쓰기 같은 특정 구분자를 제외한 단어들을 가지고 올 수 있습니다.

이번에는 배열이 아닌 포인터를 사용해보겠습니다.

포인터 사용
에러

읽기 전용인 상태로는 strtok 함수를 사용할 수 없습니다. 따라서 문자열 포인터문자열 literal할당하는 대신 동적 메모리할당하고 문자열복사하면 문제를 해결할 수 있습니다.

동적할당을 통해 문자열 자름
결과

 

지금까지는 자른 문자열 출력만 하고 끝냈습니다. 그런데 과연 실제 프로그래밍에서 출력만 하고 끝나는 경우가 대부분일까요? 당연히 아니죠. 문자열을 자른 뒤 다른 코드를 실행하거나 자른 문자열을 다시 사용한다든지 여러가지 처리를 해야하는 경우가 생깁니다. 그럼 while 반복문 안에서 모든 처리를 끝낼 수 없기에 자른 문자열을 보관해야 합니다.

 

1) 배열에 자른 문자열 보관

자른 문자열 배열에 저장 - 1
자른 문자열 배열에 저장 - 2
결과

strtok 함수 사용법은 전과 모두 동일합니다. 다만, 문자열을 자른 뒤 반환되는 메모리 주소를 저장할 포인터 배열을 선언한 후 while 반복문에서 문자열을 자르는 순간마다 반환되는 주소를 i 변수를 이용해 인덱스 값을 1씩 증가시키며 저장합니다. 모두 저장한 후에는 if 분기문으로 배열의 요소NULL이 아닐 때만 출력합니다. 

 

2) 포인터에 자른 문자열 보관

포인터 부분은 동적할당포인터배열형태선언해주는 걸 제외하면 배열로 자른 문자열보관하는 방법과 완전히 동일합니다. 따라서 s1 즉, 문자열이 할당된 변수 선언방식을 수정해주면 됩니다.

수정
결과

+ strtok_s 함수

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
Comments