45.1과 46.2 질문입니다.
, 박 태훈님이 작성질문 1. UNIT 45.1에서
char *ptr = strtok(s1, " "); // " " 공백 문자를 기준으로 문자열을 자름, 포인터 반환 while (ptr != NULL) // 자른 문자열이 나오지 않을 때까지 반복 { printf("%s\n", ptr); // 자른 문자열 출력 ptr = strtok(NULL, " "); // 다음 문자열을 잘라서 포인터를 반환 }한다고 돼 있는데 첫부분에
char *ptr = strtok(s1, " ");여기서 시작점을 s1이라는 특정 주소를 가리키는건 이해가 가는데
ptr = strtok(NULL, " ");여기서 시작점을 NULL이라고 하는건 잘 이해가 안됩니다.
문자열을 자를 시작점을 지정해주는건데 특정 주소가 아닌
NULL은 그냥 공백을 의미하는거잖아요. 어떻게 처음 잘랐던
문자열의 끝부분이라는게 성립이 되는건가요?
--------------------------------------------------------------------------------------------
질문 2. UNIT 46.2
num1 = strtol(s1, &end, 16); // 16진법으로 표기된 문자열을 정수로 변환 num2 = strtol(end, &end, 10); // 10진법으로 표기된 문자열을 정수로 변환 num3 = strtol(end, &end, 16); // 16진법으로 표기된 문자열을 정수로 변환 num4 = strtol(end, NULL, 10);에서 strtol 안에 들어가는 두번째 인자가 왜 end가 아닌 &end인지
이해가 안됩니다. end가 포인터이면 그냥 end에 주소값을 넣으면
되는거 아닌가요?
Re: 45.1과 46.2 질문입니다.
, 도장_ 관리자님이 작성strtok 함수는 많은 사람이 어려워합니다. 이미 많은 질문이 있습니다.
포럼 상단에 strtok로 검색하면 이전 답변을 볼 수 있습니다.
strtol 함수에 대해서는 Unit 46.2 처음에 함수의 원형이 쓰여 있습니다.
strtol(문자열, 끝포인터, 진법);
long strtol(char const *_String, char **_EndPtr, int _Radix);
성공하면 변환된 정수를 반환, 실패하면 0을 반환
첫 번째 인수는 char const *입니다. 간단히 char *이지만, 함수 내부에서 값이 변경되면 안 되니까 const로 지정합니다.
두 번째 인수는 변환이 끝난 문자열의 위치를 가리키는 포인터로 char** _EndPtr입니다.
문자열을 char *로 받았고, 변환이 끝난 위치를 가리키는 포인터가 필요하니까 char**입니다.
char를 가리킬 필요가 있다 -> char*로 가리킨다.
영어로는 char*이 pointer to char입니다.
char*를 가리킬 필요가 있다 -> char**로 가리킨다.
영어로는 char**이 pointer to char*입니다.
그러나 char*를 가리킬 때 주소만 필요하다면 & 주소 연산자를 붙여서
address of char*로 전달해도 됩니다. address와 pointer는 호환되니까요.
strtol 함수는 문자열 하나를 숫자 하나로 변환하는 함수가 아닙니다.
문자열에 있는 여러 숫자를 모두 숫자로 변환할 수 있는 함수입니다.
따라서 다음 호출에는 다음 위치를 전달하면 됩니다.
이에 대한 설명은 그림 46-1과 그 아래 string_to_long_multiple_integers.c에 설명되어 있습니다.