ab랑 cd 사이에 있는건 공백이잖아 널이 아니라고.. ab랑 cd사이에 널이 있으면 cd라는 문자열을 연결할 수도 없어.(보아하니 이건 니가 이해못할 것 같다)
알렉산더K(jsjin)2012-04-27 13:02
배열 맨 마지막에 있는거랑 ab와 cd사이에 있는게 똑같은건지는 확인해보면 되잖아 확인해보면 달라 임마
알렉산더K(jsjin)2012-04-27 13:02
ab 와 cd 사이의 값 \'str[2] = 0x0\' 은 NULL 이 맞고 리터럴적으로 \'\\0\' 라고 하기도 해. 배열의 맨마지막값 , 즉 str[5]의 값역시 NULL 맞다.
레노미나012(ilbo0401)2012-04-27 13:03
그리고 strtok(NULL,\"\") 여기에 두번째 인수는 왜 \" \"가 아니고 \"\"냐 한글자 한글자 오타없이 똑바로 안쓰냐
알렉산더K(jsjin)2012-04-27 13:03
근데 어떻게 넣었길래 ab와 cd사이에 0x0이 들어갔냐
알렉산더K(jsjin)2012-04-27 13:03
strtok 함수는 첫번째 호출에서 전달된 파라미터중 첫번째 파라미터 (이경우 str) 값을 변경시킨다. 즉, 토큰을 찾게되면 찾은 토큰 위치에 토큰값대신에 NULL로 교체시켜.
레노미나012(ilbo0401)2012-04-27 13:04
\"\"만 \" \"로 바꿔주면 해결되겠구만
알렉산더K(jsjin)2012-04-27 13:06
C 언어의 strtok 은 언어의 한계상 좀 조잡하게 동작하는데, 전달된 문자열(str) 에서 delimiters 를 찾으면 문자열의 처음과 delimiters 를 찾은 위치까지의 문자열을 반환해야 하는데, 이것때문에 전달된 입력 문자열(str) 에서 delimiters 가 존재하던 위치에 NULL 값을 쓰서 str 을 출력하면 delimiters 가 존재하던 위치까지의 문자열만 출력되도록 동작하는거다. 좀 조잡해.
레노미나012(ilbo0401)2012-04-27 13:10
사실 전혀 어렵지 않은 쉬운함수인데, 처음에 혼란스러우면 , 일단 스킵하고, 저런 strtok 함수를 직접만들어봐.
레노미나012(ilbo0401)2012-04-27 13:12
마지막으로, 고집쩐다. 어제 부터 물어보는거 같던데~~ 훌륭해~~ .
레노미나012(ilbo0401)2012-04-27 13:13
아, 위에 토큰과 delimiters 라는 단어를 혼용해서 썻는데, 쏘리, 둘다 같운 의미로 사용했고, strtok 의 두번째 파라미터를 말하는거다.
레노미나012(ilbo0401)2012-04-27 13:17
첫번째 호출후 delimiters가 존재하던 위치에 NULL값이 들어가고 두번째 호출부터는 strtok(NULL \"\") 이런식으로 첫번째 인자에 NULL을 써야하는데 이때 첫번째 인자의 NULL은 0번지 주소를 의미하는데 그럼 0번지 주소부터 delimiters를 찾겠다는 의미 아님? 첫번째 호출 strtok(str, \" \")이 str문자열의 첫주소에서부터 delimiters를 찾는거라면.
12(59.12)2012-04-27 13:21
근데 0번지 주소부터 delimiters를 찾는다는게 뭔가 이상함
12(59.12)2012-04-27 13:22
노노..첫번째 호출때 전달된 파라미터중 첫번째 파라미터(str) 의 주소를 기억하는거야.
레노미나012(ilbo0401)2012-04-27 13:23
즉, 이 함수(strtok) 는 첫번째 호출을 기억하고 두번째 호출은 첫번째 호출에 영향을 받아.
레노미나012(ilbo0401)2012-04-27 13:24
이러한방식은 나중에 멀티쓰레드나 병령프로그래밍시에 발목을 잡고, 그리고 직관성도 떨어져서 않좋긴한데, 워낙 오래전에 나온함수라 아직도 표준으로 쓰이는거지.
On a first call, the function expects a C string as argument for str, whose first character is used as the starting location to scan for tokens. In subsequent calls, the function expects a null pointer and uses the position right after the end of last token as the new starting location for scanning.
레노미나012(ilbo0401)2012-04-27 13:28
\"첫번째 호출에서 , 어쩌고..저쩌고... . 연속된 그다음호출에서(두번째 호출) , 함수는 첫번째 파라미터로 NULL 이 올거라고 기대하고, 첫번째 호출에서 찾은 토큰의 위치 바로 그 다음위치를 계속해서 검색할 위치의 시작 주소로 사용한다\"
ab랑 cd 사이에 있는건 공백이잖아 널이 아니라고.. ab랑 cd사이에 널이 있으면 cd라는 문자열을 연결할 수도 없어.(보아하니 이건 니가 이해못할 것 같다)
배열 맨 마지막에 있는거랑 ab와 cd사이에 있는게 똑같은건지는 확인해보면 되잖아 확인해보면 달라 임마
ab 와 cd 사이의 값 \'str[2] = 0x0\' 은 NULL 이 맞고 리터럴적으로 \'\\0\' 라고 하기도 해. 배열의 맨마지막값 , 즉 str[5]의 값역시 NULL 맞다.
그리고 strtok(NULL,\"\") 여기에 두번째 인수는 왜 \" \"가 아니고 \"\"냐 한글자 한글자 오타없이 똑바로 안쓰냐
근데 어떻게 넣었길래 ab와 cd사이에 0x0이 들어갔냐
strtok 함수는 첫번째 호출에서 전달된 파라미터중 첫번째 파라미터 (이경우 str) 값을 변경시킨다. 즉, 토큰을 찾게되면 찾은 토큰 위치에 토큰값대신에 NULL로 교체시켜.
\"\"만 \" \"로 바꿔주면 해결되겠구만
C 언어의 strtok 은 언어의 한계상 좀 조잡하게 동작하는데, 전달된 문자열(str) 에서 delimiters 를 찾으면 문자열의 처음과 delimiters 를 찾은 위치까지의 문자열을 반환해야 하는데, 이것때문에 전달된 입력 문자열(str) 에서 delimiters 가 존재하던 위치에 NULL 값을 쓰서 str 을 출력하면 delimiters 가 존재하던 위치까지의 문자열만 출력되도록 동작하는거다. 좀 조잡해.
사실 전혀 어렵지 않은 쉬운함수인데, 처음에 혼란스러우면 , 일단 스킵하고, 저런 strtok 함수를 직접만들어봐.
마지막으로, 고집쩐다. 어제 부터 물어보는거 같던데~~ 훌륭해~~ .
아, 위에 토큰과 delimiters 라는 단어를 혼용해서 썻는데, 쏘리, 둘다 같운 의미로 사용했고, strtok 의 두번째 파라미터를 말하는거다.
첫번째 호출후 delimiters가 존재하던 위치에 NULL값이 들어가고 두번째 호출부터는 strtok(NULL \"\") 이런식으로 첫번째 인자에 NULL을 써야하는데 이때 첫번째 인자의 NULL은 0번지 주소를 의미하는데 그럼 0번지 주소부터 delimiters를 찾겠다는 의미 아님? 첫번째 호출 strtok(str, \" \")이 str문자열의 첫주소에서부터 delimiters를 찾는거라면.
근데 0번지 주소부터 delimiters를 찾는다는게 뭔가 이상함
노노..첫번째 호출때 전달된 파라미터중 첫번째 파라미터(str) 의 주소를 기억하는거야.
즉, 이 함수(strtok) 는 첫번째 호출을 기억하고 두번째 호출은 첫번째 호출에 영향을 받아.
이러한방식은 나중에 멀티쓰레드나 병령프로그래밍시에 발목을 잡고, 그리고 직관성도 떨어져서 않좋긴한데, 워낙 오래전에 나온함수라 아직도 표준으로 쓰이는거지.
내 설명이 부족해 보임으로,
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
를 읽어봐되는데, 다음은 그중 일부분이다.
On a first call, the function expects a C string as argument for str, whose first character is used as the starting location to scan for tokens. In subsequent calls, the function expects a null pointer and uses the position right after the end of last token as the new starting location for scanning.
\"첫번째 호출에서 , 어쩌고..저쩌고... . 연속된 그다음호출에서(두번째 호출) , 함수는 첫번째 파라미터로 NULL 이 올거라고 기대하고, 첫번째 호출에서 찾은 토큰의 위치 바로 그 다음위치를 계속해서 검색할 위치의 시작 주소로 사용한다\"
그래서 여러개의 문자열을 검색해야 한다면, strtok(str1 ,...) ...strtok(NULL ,...) , strtok(NULL,...) , .. strtok(str2 ,..) , ...strtok(NULL,...) 때충 이런식.
그래서 strtok 는 토큰을 찾으면 찾은 그 위치를 기억했다가, 다음번 호출시 첫번째 파라미터가 NULL 이라면 기억했던 그 위치 다음부터 검색해. 만약 다음번 호출시 첫번째 파라미터가 NULL이 아니라면 첫번째 파라미터가 가리키는 주소부터 검색한다.
그렇구나.. 설명 감사함
http://winapi.co.kr/clec/reference/strtok.gif
헛..위의 링크가 훨씬 깔끔하고 좋네. ? 흉이 올려준 링크 보고 . 내 설명은 그냥 쓱 참고만해. 위에 께 훨 낫다.
C를 하려면 김상형느님의 winapi.co.kr부터 다녀와야지
알렉산더K 나대는거 쩐다. ㅋㅋㅋ ab cd 사이에 0이라고 분명 찍혀 있구만 공백이라 우기고, strtok에 대해 전혀 모르는것 같은데 0x00을 어떻게 넣었냐는 둥 ㅋㅋㅋ 이런 재미 보러 프갤 온다니까...
strtok은 진짜 쓰기 싫던데... 차라리 내가 조잡하고 비슷한거 만들어서 쓰고말지