2015-04-22 21 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; 
} 

Il codice che ho scritto sopra deve stampare 1.25, ma in base al codificatore (compilatore C online), non viene stampato 1.25. Sul codificatore, stampa 2097152.000000. Ecco lo codepad linkPerché strtof non stampa il float corretto?

Cosa ho fatto di sbagliato qui?

+4

Che cosa stampa allora? Ho ottenuto [1.250000] (http://ideone.com/Rs0Aru) su ideone –

+0

http://codepad.org/ non stampa 1,25 quando il codice sopra è compilato ed eseguito –

+2

Quindi quale output stai ottenendo? –

risposta

5

codepad ha una versione precedente di gcc e presumibilmente della libreria C standard. Apparentemente, strtof non viene dichiarato dai file di intestazione inclusi. (strtof è stato aggiunto in C99.)

Provare a utilizzare un servizio online con una versione postdiluviana di gcc. Oppure aggiungi esplicitamente la dichiarazione corretta:

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

Quello che sta succedendo è che, senza la dichiarazione, le impostazioni predefinite del compilatore il tipo di ritorno della funzione da int. Poiché la funzione restituisce effettivamente un valore float, il float viene interpretato come (non convertito in) un numero intero e quindi tale numero intero viene convertito in un valore float.

Non viene prodotto alcun avviso, presumibilmente perché -Lo non è nelle opzioni del compilatore e/o lo standard C in uso consente l'uso di funzioni non dichiarate.

+0

Da [qui] (http://codepad.org/about), sembra che codepad usi gcc 4.1.2 –

+0

@ ArunA.S: Sì. Pensi che abbia esagerato troppo? Ha otto anni. – rici

Problemi correlati