2013-03-14 4 views
7

Je n'arrive pas à faire en sorte que la fonction atoll définisse correctement une longue valeur longue dans c. Voici mon exemple:Chaîne de conversion troublante longue à longue C

#include <stdio.h> 

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

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

    return 0; 
} 

Cette impression: valeur est: 0

Cela fonctionne bien:

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

ce qui se passe ici?

+0

http://ideone.com/WntSUK J'ai essayé IDEOne et mon ordinateur, pas de problème? Est-ce tout le code? –

+0

pareil pour moi. a bien fonctionné. – varnie

+3

Quel compilateur, quelle version, y at-il des avertissements ('-Wall' dans GCC). – Zeta

Répondre

11

Tout d'abord, nous allons répondre à votre question:

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

Ensuite, nous allons discuter et répondre 'pourquoi':

Pour la compatibilité avec de très anciens programmes C (pré-C89), utiliser une fonction sans l'avoir déclarée en premier ne génère qu'un avertissement de GCC, pas une erreur (Comme souligné par le premier commentaire ici, les déclarations de fonctions implicites sont également autorisées en C89, donc générer une erreur ne serait pas approprié, c'est une autre raison pourquoi seulement une guerre ning est généré). Mais le type de retour d'une telle fonction est supposé être int (pas le type spécifié dans stdlib.h pour atoll par exemple), c'est pourquoi le programme s'exécute de manière inattendue mais ne génère pas d'erreur. Si vous compilez avec -Wall vous verrez que:

Avertissement: Déclaration implicite de la fonction atoll

Ce fait choque la plupart des gens lorsqu'ils utilisent atof sans inclure stdlib.h, auquel cas l'attend double valeur n'est pas retourné.

NOTE: (En réponse à l'un des commentaires de la question) Ceci est la raison pour laquelle peut-être tronquée si l'en-tête correct n'est pas inclus les résultats de atoll.

+0

Point mineur - les déclarations implicites sont correctes dans C89, et GCC par défaut, une erreur ne serait pas appropriée. – teppic

+1

Merci pour la bonne réponse! J'ai compilé avec -Wall comme suggéré et j'ai reçu l'avertissement. Y compris la bibliothèque correcte a corrigé le problème. –