2015-04-22 2 views
5
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(){ 
    char aaa[35] = "1.25"; 
    char* bbb = &(aaa[0]); 
    char** ccc = &(bbb); 
    float a = strtof(*ccc, ccc); 
    printf("%f\n", a); 
    return 0; 
} 

Код, который я написал выше, должен печатать 1.25, но в соответствии с кодекадой (онлайн-компилятор C) он не печатает 1.25. В кодеке он печатает 2097152.000000. Вот codepad linkПочему strtof не печатает правильный поплавок?

Что я здесь сделал неправильно?

+4

Что он печатает тогда? Я получил [1.250000] (http://ideone.com/Rs0Aru) на ideone –

+0

http://codepad.org/ не печатает 1.25, когда код выше скомпилирован и запущен –

+2

Итак, какой вывод вы получаете? –

ответ

5

codepad имеет старую версию gcc и, предположительно, стандартную библиотеку C. По-видимому, strtof не объявляется заголовочными файлами, которые вы включаете. (strtof был добавлен в C99.)

Попробуйте использовать онлайн-сервис с постдилювийской версией gcc. Или явно добавить правильное объявление:

float strtof(const char* ptr, char** end_ptr); 

Что происходит, что без декларации, компилятор по умолчанию определяет тип возвращаемого значения функции int. Поскольку функция фактически возвращает float, float интерпретируется как (не преобразованный) в целое число, а затем это целое преобразуется в float.

Предупреждение не создается, предположительно потому, что -Wall не входит в параметры компилятора и/или используемый C-стандарт позволяет использовать не объявленные функции.

+0

Из [здесь] (http://codepad.org/about), кажется, что кодо-код использует gcc 4.1.2 –

+0

@ ArunA.S: Да. Как вы думаете, я слишком сильно преувеличиваю? Это восемь лет. – rici

Смежные вопросы