Почему strtof всегда выдает 0,0000? - PullRequest
1 голос
/ 13 января 2012

Вызов strtof с числом с плавающей запятой работает нормально на моей локальной машине, но на школьных серверах strtof всегда возвращает 0.000000.Я проверил, было ли что-либо сохранено в errno, поскольку 0 должно означать ошибку, но говорит об успехе.У кого-нибудь есть идея, почему это может быть?

Вот код.

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

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

Ответы [ 2 ]

5 голосов
/ 13 января 2012

Короткая версия: компилировать с -std=gnu99 или -std=c99.Объяснение следует.

Я воспроизвел аналогичную "проблему" на своей коробке.Однако, когда я пытаюсь скомпилировать:

# gcc -Wall -o float float.c
float.c: In function 'main':
float.c:6: warning: implicit declaration of function 'strtof'
float.c:6: warning: format '%f' expects type 'double', but argument 2 has type 'int'

Итак, я посмотрел на страницу man для strtof(), и там написано:

SYNOPSIS
   #include <stdlib.h>

   double strtod(const char *nptr, char **endptr);

   #define _XOPEN_SOURCE=600   /* or #define _ISOC99_SOURCE */
   #include <stdlib.h>

   float strtof(const char *nptr, char **endptr);
   long double strtold(const char *nptr, char **endptr);

Что это означает, что это тотиз этих значений должно быть #define d, прежде чем включать stdlib.h.Тем не менее, я просто перекомпилировал с -std=gnu99, и это определяет один из них для меня, и это работает.

# gcc -std=gnu99 -Wall -o float float.c
# ./float 2.3
2.300000

Мораль: всегда компилировать с -Wall.; -)

2 голосов
/ 13 января 2012

Включили ли вы заголовок, в котором определен strtof (stdlib.h), в противном случае вы можете получить 0.0, поскольку по умолчанию неизвестные функции в C обрабатываются как возвращающие int.

...