почему strtof всегда оценивается в HUGE_VAL? - PullRequest
4 голосов
/ 02 июня 2010

В чем может быть проблема здесь? Неважно, какой номер я выберу для str, это всегда 2681561585988519419914804999641169225495873164118478675544712288744352806014709395360374859633380685538006371637297210170750776562388012100819292291

char *str = "2.6";
printf("%f\n", strtof(str, (char**)NULL));
//prints 26815615859885194199148049996411692254958731641184786755447122887443528060147093953603748596333806855380063716372972101707507765623893139892867298012168192.00

вся программа:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char *str = "2.6";
    printf("%f\n", strtof(str, NULL));
    return 1;
}

скомпилировать с -Wall:

test4.c:7: warning: implicit declaration of function âstrtofâ

Ответы [ 5 ]

8 голосов
/ 02 июня 2010

Какую платформу вы строите для / на?Вы говорите, что выдается предупреждение:

test4.c:7: warning: implicit declaration of function âstrtofâ

означает, что компилятор не знает, что strtof() возвращает число с плавающей запятой, поэтому вместо этого он будет выдвигать int на вызов printf()double.strtof() обычно объявляется в stdlib.h, который вы включаете.Но это не была стандартная функция до C99, поэтому точная платформа компилятора (и используемая конфигурация / опции) могут повлиять на то, будет ли она доступна или нет.

4 голосов
/ 02 июня 2010

strtof определяется только в C99. Может случиться так, что передача опции -std=c99 компилятору исправит ее, поскольку GCC по умолчанию (-std=gnu89) включает в себя только несколько функций C99.

Другой вариант - использовать C89-кошер strtod. В любом случае это, пожалуй, лучший вариант в долгосрочной перспективе. (Когда вам нужны знакомства, кроме исключительных обстоятельств?)

3 голосов
/ 02 июня 2010

Учитывая ваши предупреждения, попробуйте добавить -std = c99, чтобы получить стандартные определения C99 из заголовка. По умолчанию предполагается, что возвращаемое значение является целым числом, а затем попытается преобразовать его в число с плавающей точкой. Это, очевидно, будет неправильно. В качестве альтернативы вы можете просто предоставить собственное правильное объявление для strtof ().

3 голосов
/ 02 июня 2010

Возможно, вы забыли включить правильный заголовок (и)?

#include <stdlib.h>
#include <stdio.h>

int main() {
    printf("%f\n", strtof("2.6", NULL));
    return 0;
}

производит:

2.600000

для меня ...

2 голосов
/ 02 июня 2010

Как уже говорили другие, вам нужно -std = c99. Но вы также можете использовать strtod (), который является строкой для удвоения, и вам не нужно -std = c99 для этого.

У меня были проблемы с strtof () в CentOS 5.5 с glibc 2.5, если я не использовал -std = c99, но strtod () работал отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...