strtol()함수의 기능에 대해서 질문이요~

lacovnk의 이미지

http://database.sarang.net/study/c/gcc_korean/14.htm 에서,

Quote:
함수 : 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로 변환되는지는 모르겠네요 -_-

어..어째서인거죠? ㅠㅠ

sangwoo의 이미지

lacovnk wrote:

#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)를 리턴해야 하는것 아닌가요? 으음...

맞습니다. 다만 base가 3이니까 3진법으로 처리를 했겠죠..
3진수 12는 10진수로 5죠?

Quote:

책에 보니 (A Book C)
value=strtol("abcde",&p,12);

요건 c까지만 되는 것이니, ab가 변환되는 건 알겠는데
이게 왜 십진수 131로 변환되는지는 모르겠네요 -_-

어..어째서인거죠? ㅠㅠ



12진수 ab를 10진수로 변환하면 131이기 때문이죠.. :)

----
Let's shut up and code.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.