이 글에서는 strtoul을 이용해서 정수 문자열을 10진수와 16진수로 변환하는 방법과 예제에 대해서 설명합니다.
- strtoul 함수 원형 및 소개
- 사용예제
- gnu man page (strtoul)
strtoul 함수 원형 및 소개
strtoul 함수는 C 언어에서 문자열을 unsigned long 형 정수로 변환하는 함수입니다. 이 함수는 문자열을 특정 진수로 해석하여 정수로 변환할 수 있습니다. 아래는 strtoul 함수의 원형과 매개변수의 설명입니다.
unsigned long strtoul(const char* str, char** endptr, int base);
str: 변환할 정수를 나타내는 문자열입니다.
endptr: 변환된 문자열의 끝을 가리키는 포인터를 저장할 변수의 주소입니다. 이 포인터는 변환된 문자열의 다음 문자를 가리킵니다. 만약 변환 중 오류가 발생하면 NULL 값을 가리킵니다. 이 매개변수를 사용하지 않을 경우에는 NULL로 설정할 수 있습니다.
base: 진수를 나타내는 정수 값입니다. 일반적으로 0을 사용하면 문자열의 접두사에 따라 16진수, 8진수, 10진수를 자동으로 판별합니다. 2에서 36 사이의 값을 지정할 수도 있습니다.
사용예제
아래는 strtoul 함수의 사용 예제입니다. 예제에서는 10진수와 16진수로 표현된 문자열을 unsigned long 형 정수로 변환합니다.
#include <stdio.h> #include <stdlib.h> int main() { const char* str1 = "12345"; // 10진수 문자열 const char* str2 = "0x1F4"; // 16진수 문자열 unsigned long num1 = strtoul(str1, NULL, 10); unsigned long num2 = strtoul(str2, NULL, 0); printf("num1: %lu\n", num1); printf("num2: %lu\n", num2); return 0; }
위 예제에서는 strtoul(str1, NULL, 10)을 통해 문자열 "12345"를 10진수로 해석하여 unsigned long 형 정수인 num1에 저장합니다. 또한, strtoul(str2, NULL, 0)을 통해 문자열 "0x1F4"를 접두사 "0x"를 보고 16진수로 해석하여 unsigned long 형 정수인 num2에 저장합니다. 각각의 결과를 출력하면 num1은 12345, num2는 500이라는 값이 나타납니다.
strtoul 함수를 사용하여 문자열을 정수로 변환할 때는 주의해야 할 점이 있습니다. 변환 중에 오류가 발생하면 에러 전까지 변환한 값을 반환하거나 ULONG_MAX 값을 반환합니다. endptr를 통해 변환 중단 위치를 확인할 수 있습니다. 예를 들어, endptr가 NULL이 아닌 경우에는 변환 중단 위치가 저장됩니다. 따라서 변환 결과를 정확히 확인하기 위해서는 반환값과 endptr를 모두 확인해야 합니다.
gnu man page (strtoul)
아래는 man strtoul을 한 결과 문서 입니다.
SYNOPSIS #include <stdlib.h> unsigned long int strtoul(const char *nptr, char **endptr, int base); unsigned long long int strtoull(const char *nptr, char **endptr, int base); Feature Test Macro Requirements for glibc (see feature_test_macros(7)): strtoull(): XOPEN_SOURCE >= 600 || _BSD_SOURCE || _SVID_SOURCE || _ISOC99_SOURCE; or cc -std=c99 DESCRIPTION The strtoul() function converts the initial part of the string in nptr to an unsigned long int value according to the given base, which must be between 2 and 36 inclusive, or be the special value 0. The string may begin with an arbitrary amount of white space (as determined by isspace(3)) followed by a single optional '+' or '-' sign. If base is zero or 16, the string may then include a "0x" prefix, and the number will be read in base 16; otherwise, a zero base is taken as 10 (decimal) unless the next character is '0', in which case it is taken as 8 (octal). The remainder of the string is converted to an unsigned long int value in the obvious manner, stopping at the first character which is not a valid digit in the given base. (In bases above 10, the letter 'A' in either upper or lower case represents 10, 'B' repre- sents 11, and so forth, with 'Z' representing 35.) If endptr is not NULL, strtoul() stores the address of the first invalid character in *endptr. If there were no digits at all, strtoul() stores the original value of nptr in *endptr (and returns 0). In particular, if *nptr is not '\0' but **endptr is '\0' on return, the entire string is valid. The strtoull() function works just like the strtoul() function but returns an unsigned long long int value. RETURN VALUE The strtoul() function returns either the result of the conversion or, if there was a leading minus sign, the negation of the result of the conversion represented as an unsigned value, unless the original (non-negated) value would overflow; in the latter case, strtoul() returns ULONG_MAX and sets errno to ERANGE. Precisely the same holds for strtoull() (with ULLONG_MAX instead of ULONG_MAX). ERRORS EINVAL (not in C99) The given base contains an unsupported value. ERANGE The resulting value was out of range. The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned). CONFORMING TO strtoul() conforms to SVr4, C89, C99 and POSIX-2001, and strtoull() to C99 and POSIX.1-2001.