IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Des questions sur atoi et la conversion de type


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    Par défaut Des questions sur atoi et la conversion de type
    Bonjour, bonsoir =)
    Je me suis amusez à programmer la fonction atoi,
    et j'aurai quelque question sur les conversions d'un type en un autre (je croit que ça s’appelle des cast)
    Donc dans l'exemple un char en int.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    int	fonction_atoi(char *str)
    {
    	int result ;
    	int i ;
    	int n ;
     
    	i = 0 ;
    	n = 0 ;
     
    	while((str[i] == '\n') || (str[i] == ' '))
    		i++ ;
     
    	if(str[i] == '-')
    		n = 1 ;
     
    	if(str[i] == '-' || str[i] == '+')
    		i++ ;
     
    	while(str[i] && (sttr[i] >= '0') && (sttr[i] <= '9'))
    	{
    		result = result * 10 ;
    		result = result + str[i] - '0' ;
                    i++ ;
    	}
     
    	if(n == 1)
    		return (-result) ;
    	else
    		return (result) ;
    }
    Alors pour commencer ma premier question.

    1 - Ques qu'il ce passe quand ont fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	result = result * 10 ;
    	result = result + str[i] - '0' ;
    Admettons que j'ai donner a ma fonction atoi 155 en paramètre .
    result = result * 10
    J'ai bien compris l'utilité de cette ligne (Au prochain tour le 1 sera un 10 au quel ont ajoutera 5, puis 15 * 10 = 150 au quel ont ajoutera 5 ce qui nous donnera le 155 attendus)

    Concernant la seconde ça reste très trouble.
    Donc ont ajoute result au caractère parcourut par i jusque là pas de soucis. Mais quand je faisait juste ça ça ne marchais pas un amis ma dit rajoute un "- '0'" magique tout marche ! Sauf que je n'aime pas trop la magie Auriez vous une explication ? Que ce passe t'il vraiment derrière cette ligne ? Comment un char de 1 octet et convertit en un int de 4 octet ?

    2 - Comment voir toute les possibilités d'une fonction ?

    En voulant reproduire cette fonction je les comparés a l'original dans mon main.
    Je lui passe donc les même variable que la mienne.
    J'ai donc fait des test pour savoir comment elle réagis a certain paramétré (J'ai donc compris qu'il fallait gérée le '+'/ '-' les espace et le \n )
    Mais je ne connait pas toute les possibilité de cette fonction et je n'est rien trouvé dans le man.


    Merci de votre lecture/réponse.
    Désolé pour les fautes et mes mots imprécis.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Tu te fourvoies gravement

    atoi n'est pas du cast.
    Un cast c'est juste "prendre du binaire" et soit "réinterpréter son sens" (exemple: int <-> float) soit "le tronquer/ l'agrandir" (exemple: char <-> int).

    Pour atoi qui est une fonction obsolète, elle convertit de l'ascii (le a de atoi) en entier (le i de atoi).
    atoi veut dire: ascii to integer.

    Donc passer de la chaîne "185274" à l'entier 185274.

    Et à partir de là c'est trivial :
    • Comme tu vas recevoir en entrée un caractère entre '0' et '9' inclus (si valide), alors il faut soustraire le caractère '0' pour avoir le chiffre correspond. En ASCII, les caractères chiffres, majuscules, minuscules se suivent.
    • Tu vas faire une conversion en prenant les caractères de la gauche vers la droite. Donc tu vas être obligé de décaler le nombre résultat vers la gauche pour lui ajouter le nouveau chiffre: current = ((current * 10) + new_digit).


    On fait une conversion de la gauche vers la droite par commodité . Sinon, il faudrait trouver la fin de ta chaîne (éventuellement faire la validation en même temps) et ensuite faire la conversion en repartant en sens inverse: current = (current + (new_digit * current_pow)); current_pow *= 10;.

  3. #3
    Membre du Club
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    Par défaut
    Merci de t'es explication !
    Une dernière question, ou je peux trouver ce que atoi prend comme char ?
    J'ai vu avec des test que il prenais des espace et \n.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    atoi

    En gros cette fonction fonctionne comme cela : ^[ \t]*[1-9]+{skip}

    Après cela dépend de ce que sont les caractères espace : seulement l'espace et la tabulation ou alors élargi avec les '\r' '\n' et/ ou autres


    Édit: C'est plutôt ^[ \t]*[1-9]*{skip} avec un retour à 0 en cas de chaîne sans caractères décimaux trouvés

  5. #5
    Membre du Club
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    Par défaut
    Merci foetus !
    Sujet résolut =)

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    atoi est obsolète, dans la mesure du possible son usage doit être remplacé par la famille de strtol ou une implémentation « maison ».

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Moi je pensais plus à sscanf

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Des questions sur Sepi ?
    Par fab56 dans le forum Sepi
    Réponses: 4
    Dernier message: 25/05/2007, 23h06
  2. Diverses questions sur les fonctions de conversion
    Par Louis-Guillaume Morand dans le forum Access
    Réponses: 12
    Dernier message: 27/12/2006, 11h56
  3. des questions sur les listes chainées
    Par hunter99 dans le forum C
    Réponses: 13
    Dernier message: 05/12/2006, 23h51
  4. Réponses: 1
    Dernier message: 24/02/2006, 01h53
  5. Des questions sur suse linux !
    Par barucca dans le forum SUSE
    Réponses: 3
    Dernier message: 07/04/2004, 12h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo