C strtoul function
last modified April 8, 2025
String to number conversion is a common task in C programming, and
strtoul is a robust function for converting strings to unsigned
long integers. This tutorial covers strtoul in depth, including its
syntax, usage, and error handling. We'll explore practical examples and discuss
why strtoul is safer than functions like atoi.
Understanding strtoul helps create more reliable and secure string
parsing code.
What Is strtoul?
The strtoul function converts a string to an unsigned long integer.
It's declared in stdlib.h and provides robust error handling.
Unlike atoi, it detects conversion errors and supports different
bases. The function takes three parameters: the string to convert, an optional
pointer to store the end position, and the numeric base (2 to 36). Always prefer
strtoul over atoi for production code.
Basic strtoul Usage
This example demonstrates converting a simple decimal string to an unsigned long.
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *str = "12345";
char *endptr;
unsigned long value = strtoul(str, &endptr, 10);
if (*endptr != '\0') {
printf("Conversion error at: %s\n", endptr);
return 1;
}
printf("Converted value: %lu\n", value);
return 0;
}
Here, strtoul converts the string "12345" to an unsigned long.
We use base 10 (decimal) and check endptr for conversion errors.
If conversion succeeds, endptr points to the string's null
terminator. This basic pattern is essential for safe string conversion.
Always check endptr to detect partial conversions.
Hexadecimal Conversion
strtoul can convert hexadecimal strings when using base 16.
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *hex_str = "0x1a3f";
char *endptr;
unsigned long value = strtoul(hex_str, &endptr, 16);
if (*endptr != '\0' && *endptr != '\n') {
printf("Conversion error at: %s\n", endptr);
return 1;
}
printf("Hex value: %lu (0x%lx)\n", value, value);
return 0;
}
This example converts the hexadecimal string "0x1a3f" to an unsigned long.
The base 16 tells strtoul to interpret the string as hex.
Note that the "0x" prefix is optional when using base 16. The function
also handles uppercase hex digits (A-F) and lowercase (a-f) equally.
Hexadecimal conversion is commonly used for parsing memory addresses or
bitmask values.
Error Handling with strtoul
This example demonstrates comprehensive error handling with strtoul.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
int main() {
const char *str = "99999999999999999999";
char *endptr;
unsigned long value;
errno = 0;
value = strtoul(str, &endptr, 10);
if (errno == ERANGE) {
printf("Value out of range\n");
return 1;
}
else if (*endptr != '\0') {
printf("Invalid character at: %s\n", endptr);
return 1;
}
printf("Converted value: %lu\n", value);
return 0;
}
This code shows proper error handling for strtoul. We check
errno for range errors and endptr for invalid
characters. The large number will trigger ERANGE as it exceeds
ULONG_MAX. Always set errno to 0 before calling
strtoul to distinguish between 0 as a valid result and an
error. This pattern is crucial for robust string parsing.
Automatic Base Detection
strtoul can automatically detect the numeric base when using 0.
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *decimal = "12345";
const char *hex = "0x1a3f";
const char *octal = "0755";
char *endptr;
printf("Decimal: %lu\n", strtoul(decimal, &endptr, 0));
printf("Hex: %lu\n", strtoul(hex, &endptr, 0));
printf("Octal: %lu\n", strtoul(octal, &endptr, 0));
return 0;
}
When base 0 is specified, strtoul interprets the string like C
literals: leading "0x" means hex, leading "0" means octal, otherwise decimal.
This matches how C compilers interpret numeric constants. Automatic base
detection is convenient but may be less explicit than specifying the base
directly. Use this feature when you need to parse numbers in various formats.
Parsing Multiple Numbers
This example shows how to parse multiple numbers from a string using
strtoul and the endptr.
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *str = "10 20 30 40";
char *endptr = (char *)str;
while (*endptr != '\0') {
unsigned long value = strtoul(endptr, &endptr, 10);
if (endptr == str) {
break; // No conversion performed
}
printf("Parsed: %lu\n", value);
// Skip whitespace
while (*endptr == ' ') {
endptr++;
}
}
return 0;
}
This code parses multiple unsigned integers from a space-separated string.
After each conversion, endptr points to the next character,
allowing sequential parsing. We skip whitespace between numbers manually.
This technique is useful for parsing input files or command-line arguments.
Note the check for endptr == str to detect when no conversion
occurred.
Best Practices for Using strtoul
- Always check endptr: Verify where conversion stopped.
- Reset errno: Set to 0 before calling to detect range errors.
- Prefer over atoi:
strtoulhas better error handling. - Choose appropriate base: Use 0 for auto-detection when needed.
- Validate input: Check for empty strings or NULL pointers.
Source
This tutorial has explored the strtoul function, from basic usage to
advanced parsing techniques. Proper string conversion is essential for secure and
reliable C programs. Always prefer strtoul over simpler but less
safe alternatives like atoi.
Author
List C Standard Library.