강좌 & 팁
글 수 2,412
2014.10.29 12:14:54 (*.134.169.166)
51112
통신으로 콤마로 구분된 문자열을 받았습니다.
"에프에이리눅스,포럼,IoT 강좌"
이 문자열을 콤마로 구분하여 각각의 단어를 분리하고 싶습니다.
이런 처리를 어떻게 하시나요? for 루푸로 직접 바이트 단위로 검색하시나요?
아니면 index() 함수를 사용하시나요?
특정 문자로 구분된 문자열은 strok() 함수를 사용하면 편합니다. strok() 함수 사용 예를 보실까요?
#include <stdio.h>#include <string.h>int main( void){char str[] = "에프에이리눅스,포럼,IoT 강좌";char *ptr;ptr = strtok( str, ",");printf( "%s\n", ptr); // "에프에이리눅스" 출력while( ptr = strtok( NULL, " ")){printf( "%s\n", ptr); // 이후로 차례로 "포럼", "IoT 강좌" 가 출력}return 0;}
자, 여기까지는 당연히 문제가 없습니다. 그러나 원래의 문자열인 str을 strtok() 함수 사용 후에 다시 사용한다면 어떻게 될까요?
ptr = strtok( str, ","); // str을 strok()에 사용printf( "%s\n", ptr);while( ptr = strtok( NULL, " ")){printf( "%s\n", ptr); // str을 strok()에 사용}save_string( str); // strtok()에 사용했던 문자열을 다른 함수에 전달
결론적으로 말씀드려 strtok() 함수는 원래의 문자열을 변경하기 때문에 strtok()에 사용한 문자열을 다시 사용하면 안 됩니다.
이유는 strtok() 함수 사용 후의 str을 출력해 보시면 이해가 쉽습니다. printf()로 출력하면 "에프에이리눅스,포럼,IoT 강좌"가 아닌
"에프에이리눅스"만 나옵니다. 이유는 구분에 사용된 콤마(,)가 NULL문자로 바뀌기 때문입니다.
그러므로 strtok() 함수를 사용하려면 원래의 문자열을 복사해서 사용하는 것이 안전합니다.