2013-03-14 16 views
7

Mam problem z uzyskaniem funkcji atola, aby odpowiednio ustawić długą wartość w c. Oto mój przykład:Niepoprawny ciąg konwertujący na długo w C

#include <stdio.h> 

int main(void) { 
    char s[30] = { "115" }; 
    long long t = atoll(s); 

    printf("Value is: %lld\n", t); 

    return 0; 
} 

to drukuje: wartość wynosi: 0

Działa to jednak:

printf("Value is: %lld\n", atoll(s)); 

Co tu się dzieje?

+0

http://ideone.com/WntSUK Próbowałem zarówno IDEOne, jak i mojego komputera, bez problemów? Czy to cały kod? –

+0

to samo dla mnie. działało dobrze. – varnie

+3

Jaki kompilator, w jakiej wersji, istnieją ostrzeżenia ('-Wall' w GCC). – Zeta

Odpowiedz

11

Najpierw odpowiedzieć na pytanie:

#include <stdio.h> 
#include <stdlib.h> // THIS IS WHAT YOU ARE MISSING 


int main(void) { 
    char s[30] = { "115" }; 
    long long t = atoll(s); 

    printf("Value is: %lld\n", t); 

    return 0; 
} 

Następnie omówmy i odpowiedź 'dlaczego?':

dla kompatybilności z bardzo starych programów C (pre-C89) używanie funkcji bez zadeklarowania jej jako pierwszego generuje ostrzeżenie z GCC, a nie błąd (jak wskazano tutaj w pierwszym komentarzu, również domyślne deklaracje funkcji są dozwolone w C89, dlatego generowanie błędu nie byłoby właściwe, to jest kolejny powód dlaczego tylko wojna ning jest generowany). Jednak przyjmuje się, że typ powrotu takiej funkcji to int (nie jest to typ określony w stdlib.h dla atoll), dlatego program wykonuje się nieoczekiwanie, ale nie generuje błędu. Jeśli skompilować z -Wall widać, że:

Warning: niejawnej deklarację funkcji atoll

Fakt głównie szokuje ludzi kiedy używają atof bez tym stdlib.h, w którym to przypadku spodziewany double wartości nie jest zwracane.

UWAGA: (W odpowiedzi na jeden z komentarzy z pytaniem) To jest powód, dlaczego wyniki atoll może być obcięta, jeśli poprawny nagłówek nie jest wliczony w cenę.

+0

Drobny punkt - domyślne deklaracje są w porządku w C89, a GCC domyślnie to, więc błąd nie byłby odpowiedni. – teppic

+1

Dziękuję za wspaniałą odpowiedź! Skompilowałem z -Wall zgodnie z sugestią i otrzymałem ostrzeżenie. Włączenie poprawnej biblioteki rozwiązało problem. –