strtol()함수의 기능에 대해서 질문이요~
http://database.sarang.net/study/c/gcc_korean/14.htm 에서,
함수 : long int strtol (const char *string, char **tailptr, int base)strtol ("스트링에서 long 으로 ") 함수는 문자열의 처음부분을 long int형으로 리턴된 부호화된 정수 로 바꾼다. 이 함수는 다음과 같이 문자열을 분해하려 시도한다.
o 공백문자(whitespace characters)의 열. 공백문자는 isspace 함수로 알아낼 수 있다( 4.1절 [Classification of Characters] 41 페이지 참조.). 이들 공백문자는 버려진다.
o 임의의 플러스 또는 마이너스 부호('+' 또는 '-').
o 기수가 정해진, 아무런 공백이 없는 숫자들의 열. 만일 기수가 0이면, '0'( 8진수로 정하기 ) 또는 '0x' 나 '0X'( 16진수 ) 로 시작하는 숫자열이 아니한, 십진수로 가정한다. 즉, 같은 구문을 C에서 정 수 상수를 위해 사용한다. 그렇지 않다면 기수는 반드시 2와 35 사이이여야만 한다. 만일 기수가 16 이면, 그 숫자는 '0x' 나 '0X' 로 시작될 것이다.
o 문자열에서 남은 나머지 문자들. 만일 tailptr이 널 포인터가 아니라면, strcol은 *tailptr에 tail을 가 리키는 포인터를 저장한다.
만일 그 문자열이 오직 공백으로만 되어 있거나, 정해진 기수의 정수가 가져야하는 처음의 부문자열 을 포함하지 않는다면, 아무런 변환이 수행되지 않는다. 이 경우, strcol은 0을 리턴하고, *tailptr에 저장된 값은 스트링의 값이다.
표준 "C" 지역이 아닌 다른 지역에서, 이 함수는 그 지역의 구문에 의존되는 부가적인 동작을 인식 할 것이다. 만일 그 문자열이 정수에 맞는 구문을 갖고 있지만 오버플로우 때문에 표현할 수 없다 면, strtol은 그 값의 부호에 알맞는 LONG_MAX 또는 LONG_MIN을 리턴한다(A.5.2절 [Range of Type], 388 페이지 참조.) 또한 오버플로우가 났음을 알리기 위해서 errno를 ERANGE로 설정한다. 이것에 대한 예는 이 절의 마지막에 있다.
그런데 다음과 같은 코드를 실행하면
#include<stdlib.h> int main(void) { char *p; long value; value=strtol("12345",&p,3); printf("value=%ld,endstring=\"%s\"\n",value,p); return 1; }
value=5,endstring="345"
음. 3까지 처리를 하고, 12에 대한 변환을 해야 하니 long (12)를 리턴해야 하는것 아닌가요? 으음...
책에 보니 (A Book C)value=strtol("abcde",&p,12);
요건 c까지만 되는 것이니, ab가 변환되는 건 알겠는데
이게 왜 십진수 131로 변환되는지는 모르겠네요 -_-
어..어째서인거죠? ㅠㅠ
Re: strtol()함수의 기능에 대해서 질문이요~
맞습니다. 다만 base가 3이니까 3진법으로 처리를 했겠죠..
3진수 12는 10진수로 5죠?
12진수 ab를 10진수로 변환하면 131이기 때문이죠.. :)
----
Let's shut up and code.
댓글 달기