In C

2013-03-14 5 views
7

Probleme beim Umwandeln der Zeichenfolge in lang. Ich habe Probleme, die Atoll-Funktion zu veranlassen, einen langen langen Wert in c richtig einzustellen. Hier ist mein Beispiel:In C

#include <stdio.h> 

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

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

    return 0; 
} 

Diese Drucke: Wert: 0

Das funktioniert aber:

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

Was ist hier los?

+0

http://ideone.com/WntSUK Sie haben sowohl IDEOne als auch meinen Computer getestet, keine Probleme? Ist das alles der Code? –

+0

das gleiche für mich. gut gearbeitet. – varnie

+3

Welcher Compiler, welche Version, gibt es irgendwelche Warnungen ('-Wall' in GCC). – Zeta

Antwort

11

Zuerst lassen Sie uns Ihre Frage beantworten:

#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; 
} 

Dann wollen wir diskutieren und Antwort 'warum?':

Für die Kompatibilität mit sehr alten C-Programmen (pre-C89), eine Funktion zu verwenden, ohne sie vorher zu deklarieren, erzeugt nur eine Warnung von GCC, keinen Fehler (Wie der erste Kommentar hier anmerkte, sind auch implizite Funktionsdeklarationen in C89 erlaubt, daher wäre die Erzeugung eines Fehlers nicht sinnvoll, das ist ein anderer Grund warum nur ein Krieg ning wird erzeugt). Es wird jedoch angenommen, dass der Rückgabetyp einer solchen Funktion int ist (nicht der in stdlib.h für atoll angegebene Typ), weshalb das Programm unerwartet ausgeführt wird, aber keinen Fehler generiert. Wenn Sie mit -Wall kompilieren werden Sie sehen, dass:

Warnung: Implizite Deklaration der Funktion atoll

Diese Tatsache vor allem Menschen schockiert, wenn sie atof verwenden, ohne stdlib.h einschließlich, in welchem ​​Fall der double Wert erwartet wird nicht zurückgegeben.

HINWEIS: (Als Antwort auf eine der Bemerkungen der Frage) Dies ist der Grund, warum die Ergebnisse der atoll möglicherweise abgeschnitten werden, wenn die richtigen Header nicht enthalten ist.

+0

Kleinster Punkt - Implizite Deklarationen sind in C89 in Ordnung, und GCC ist standardmäßig auf diesen Wert eingestellt, sodass ein Fehler nicht angemessen wäre. – teppic

+1

Vielen Dank für die tolle Antwort! Ich habe mit -Wall wie vorgeschlagen kompiliert und die Warnung bekommen. Das Einbinden der richtigen Bibliothek behob das Problem. –