C strtold function
last modified April 8, 2025
String to number conversion is a common task in C programming, and strtold
is the preferred function for converting strings to long double values. This tutorial
covers strtold in depth, including its syntax, usage, and error handling.
We'll explore practical examples and discuss why it's safer than alternatives like
atof. Understanding strtold helps create robust programs
that handle numeric input correctly.
What Is strtold?
The strtold function converts a string to a long double floating-point
value. It's declared in stdlib.h and provides robust error handling.
Unlike atof, strtold can detect conversion errors and
supports different number bases. It takes three parameters: the string to convert,
a pointer to store the end position, and optionally the number base. Always prefer
strtold over atof for reliable string-to-number conversion.
Basic strtold Usage
This example demonstrates basic string to long double conversion using strtold.
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *str = "3.14159265358979323846";
char *endptr;
long double value = strtold(str, &endptr);
if (str == endptr) {
printf("No conversion performed\n");
} else {
printf("Converted value: %.20Lf\n", value);
}
return 0;
}
Here, strtold converts the string representation of pi to a long double.
The endptr helps detect if conversion occurred by comparing it to the
original string pointer. The precision of %.20Lf shows the long double's
extended precision. Always check endptr to verify successful conversion.
Error Handling with strtold
This example shows proper error handling when using strtold.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
const char *str = "invalid123.45";
char *endptr;
errno = 0;
long double value = strtold(str, &endptr);
if (str == endptr) {
printf("No digits were found\n");
} else if (errno == ERANGE) {
printf("Value out of range\n");
} else {
printf("Converted value: %Lf\n", value);
printf("Remaining string: %s\n", endptr);
}
return 0;
}
This code demonstrates comprehensive error checking with strtold.
We check errno for range errors and endptr for conversion
success. The example intentionally uses an invalid string to show error detection.
Proper error handling is crucial when processing user input or external data.
Hexadecimal Floating-Point Conversion
strtold supports hexadecimal floating-point notation as shown here.
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *str = "0x1.8p1"; // 1.5 * 2^1 = 3.0
char *endptr;
long double value = strtold(str, &endptr);
if (*endptr != '\0') {
printf("Extra characters after number: %s\n", endptr);
} else {
printf("Hex float value: %Lf\n", value);
}
return 0;
}
This example converts a hexadecimal floating-point string to a long double.
The format 0x1.8p1 represents 1.5 (1 + 8/16) multiplied by 2^1.
Hexadecimal floating-point is useful in low-level programming and precise
specification of values. The endptr check verifies the entire string
was consumed.
Locale-Aware Conversion
This example demonstrates locale-aware number conversion with strtold.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main() {
setlocale(LC_NUMERIC, "de_DE.UTF-8");
const char *str = "1.234,56"; // German decimal format
char *endptr;
long double value = strtold(str, &endptr);
if (*endptr != '\0') {
printf("Conversion stopped at: %s\n", endptr);
} else {
printf("Locale-aware value: %'Lf\n", value);
}
return 0;
}
Here, strtold attempts to parse a locale-specific number format.
Note that standard strtold typically expects period as decimal point.
For full locale support, consider strtod_l or manual preprocessing.
The example shows the importance of understanding your input's number format.
Scientific Notation Conversion
This example shows strtold handling scientific notation.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
const char *str = "-6.02214076e23";
char *endptr;
errno = 0;
long double value = strtold(str, &endptr);
if (errno == ERANGE) {
printf("Value out of range\n");
} else if (*endptr != '\0') {
printf("Extra characters: %s\n", endptr);
} else {
printf("Avogadro's number: %Le\n", value);
}
return 0;
}
The code converts Avogadro's number from scientific notation to long double.
The %Le format specifier displays the result in scientific notation.
strtold correctly handles the sign, mantissa, and exponent components.
Range checking with errno is especially important for large exponents.
Best Practices for Using strtold
- Always check endptr: Verify where conversion stopped in the input string.
- Check errno for range errors: Set errno to 0 before calling strtold.
- Prefer strtold over atof: atof provides no error detection capabilities.
- Handle locale considerations: Be aware of decimal point conventions.
- Validate entire input: Check if endptr points to expected position.
Source
This tutorial has explored the strtold function, from basic usage to
advanced considerations. Proper string-to-number conversion is essential for
robust input processing and data handling in C programs.
Author
List C Standard Library.