char strbuf[24];
strlcpy(strbuf, str, sizeof(strbuf));
char *pt = strbuf;
while ((*pt != '\0') && isblank(*pt)) {
pt++;
} // Trim leading spaces
signed char sign = 1;
if (*pt == '-') {
sign = -1;
}
if (*pt == '-' || *pt == '+') {
pt++;
} // Skip any sign
float left = 0;
if (*pt != '.') {
left = atoi(pt); // Get left part
while (isdigit(*pt)) {
pt++;
} // Skip number
}
float right = 0;
if (*pt == '.') {
pt++;
uint32_t max_decimals = 0;
while ((max_decimals < 8) && isdigit(pt[max_decimals])) {
max_decimals++;
}
pt[max_decimals] = '\0'; // Limit decimals to float max of 8
right = atoi(pt); // Decimal part
while (isdigit(*pt)) {
pt++;
right /= 10.0f;
}
}
float result = left + right;
if (sign < 0) {
return -result; // Add negative sign
}
return result;
сравни с оригинальным - он полностью покрывает, а этот нет - но не нужны более 8 знаков допустим , можно сэкономить еще