[C] Probleme de conversion char -> int

Probleme de conversion char -> int [C] - C - Programmation

Marsh Posté le 26-10-2004 à 13:08:06    

Bonjour, j'ai vu que mon probleme avait déja été évoqué dans plusieurs sujets, mais le probleme est que je débute en C et que lorsque j'entends parler de atoi, strtol, sscanf, etc... ben je ne comprends pas grand chose et je sais d'autant moins comment utiliser ces fonctions.
 
J'avais entendu parler (grace a mon ami Google :hello: ) de itoa() pour passer de int à char et de atoi() pour passer de char à int. Je les ai donc utilisés dans mon prog, et en foutant des printf() un peu partout dans mon programme je me suis rendu compte que c'est l'emploi de atoi() que j'ai fait qui fait que ca ne fonctionne pas correctement (itoa lui fait bien son boulot ;) ).
 
Voici la partie de mon code qui me pose probleme:

Code :
  1. int k,m,o,u,r;// Petit rappel de ma declaration de variables
  2. CH3 nb;// CH3 est défini par "typedef char CH3[4];"
  3.     r=m+3*o+3*u+r;
  4.     printf("\nr_initial=%d\n",r);// A supprimer
  5.     while(r>9)
  6.     {
  7.         itoa(r,nb,10);
  8.         printf("Selon itoa, r=%s\n",nb);// A supprimer
  9.         for(k=0,o=0;nb[k]!='\0';k=k+1)
  10.         {
  11.             r=atoi(&nb[k]);
  12.             printf("Selon atoi, r[%d]=%d\n",k,r);// A supprimer
  13.             system("pause" );// A supprimer
  14.             o=o+r;
  15.         }   
  16.         r=o;
  17.     }
  18.     printf("r_final=%d\n",r);// A supprimer


 
En gros,le but de cette partie c'est d'additionner les chiffres du nombre en entrée jusquà ce qu'il n'y ait plus qu'un seul chiffre.
(Par exemple si j'ai r=329 entrée, je veux r=3+2+9=14 puis r=1+4=5 en sortie).
Les lignes commentées par "A supprimer" sont mes printf de test.
Je n'ai pas encore vu les pointeurs en cours, donc si vous me parlez de "char*" ou qqch dans le genre je risque de ne pas tout suivre (c'est dur d'etre en face de qqn qui y connait rien  :D )
 
Mon probleme avec est que si par exemple j'ai 329 en entrée (donc nb="329" ), j'obtiens nb[0]=329, nb[1]=29, nb[2]=9 au lieu de nb[0]=3, nb[1]=2, nb[2]=9 (ce que j'aurais souhaité).
 
Merci d'avance pour vos réponses (pas trop complexes pour mon niveau de préférence  :hello: )


Message édité par mcyrb le 26-10-2004 à 13:13:03
Reply

Marsh Posté le 26-10-2004 à 13:08:06   

Reply

Marsh Posté le 26-10-2004 à 13:11:29    

allez laisse béton, t'as rien compris aux pointeurs ni à rien
 
utilise strtol, atoi est déprécié. itoa n'existe pas. regarde aussi sscanf

Reply

Marsh Posté le 26-10-2004 à 13:15:01    

Taz a écrit :

allez laisse béton, t'as rien compris aux pointeurs ni à rien
 
utilise strtol, atoi est déprécié. itoa n'existe pas. regarde aussi sscanf


 
J'ai déja dit que j'avais pas encore vu les pointeurs donc je risque pas de les comprendre. Et j'ai dit aussi que j'aais déja entendu parler ce que tu dis mais c'est pas en m'enoncant ce que j'ai déja lu qu je v obtenir les information dont j'ai besoin.
 
Et si itoa n'existe pas comment ca se fait qu'il marche ?  :??:  
 
Merci pour ta réponse et ton amabilité  :jap:


Message édité par mcyrb le 26-10-2004 à 13:16:08
Reply

Marsh Posté le 26-10-2004 à 13:29:29    

mcyrb a écrit :

itoa() pour passer de int à char et de atoi() pour passer de char à int.


 
Bah non justement, ça passe de char * à int. Un char * est un pointeur.  
A ton niveau, on peut considérer qu'une chaîne de caractères, un tableau et un pointeur, ça correspond à la même chose: l'endroit où commence une séquence de caractères.
 
La façon que les fonctions standard du C utilisent pour savoir combient de caractères il y a dans une chaîne, c'est de la terminer par 0. Donc, ta chaîne fait {'3', '2', '9', 0}, où '3' est le caractère correspondant à 3, etc.
 
En faisant un atoi, tu indiques comme un grand où se trouve le début de ta chaîne, mais la fin reste la même: atoi s'arrete au premier 0 rencontré. Donc 329, puis 29, puis 9...
 
Pour convertir un caractère en chiffre, tu n'as qu'à remplacer :  
          r=atoi(&nb[k]);
par:
          r=nb[k]-'0';
 
Mais de toutes façons, ce n'est pas une bonne façon de faire ton exercice. Il serait plus rationnel de ne travailler que sur les entiers, sans passer par les chaîne au passage (en divisant pas 10, et en récupérant le reste, via modulo).
 
Ca devrait suffir pour commencer...


Message édité par Lam's le 26-10-2004 à 13:32:29
Reply

Marsh Posté le 26-10-2004 à 13:30:43    

tu veux quoi ? y a toute une batterie de fonction pour faire le boulot, c'est pas suffisant ?
 
 
itoa, c'est pas standard, ça dépend de ta plateforme. Alors fais sans, surtout qu'itoa a bien d'autre problème.

Reply

Marsh Posté le 26-10-2004 à 13:34:47    

Taz a écrit :

tu veux quoi ? y a toute une batterie de fonction pour faire le boulot, c'est pas suffisant ?
 
 
itoa, c'est pas standard, ça dépend de ta plateforme. Alors fais sans, surtout qu'itoa a bien d'autre problème.


Taz, il débute...
 
Tu vas pas lui demander de se farcir le standard C alors qu'il ne sait même pas c'est quoi un pointeur.
 
Laisse le se planter, apprendre de ses erreurs, et dans quelques mois, on pourra commencer à lui taper sur les doigts parce que son code est du bricolage. Mais là, c'est prématuré.

Reply

Marsh Posté le 26-10-2004 à 13:38:41    

ben pour debuter, autant apprendre directement *printf/*scanf ?

Reply

Marsh Posté le 26-10-2004 à 13:44:03    

cris56 a écrit :

ben pour debuter, autant apprendre directement *printf/*scanf ?


On en a déja parlé il y a pas longtemps (dans le fameux topic sur size_t): les e/s, c'est complexe comme sujet. Taille mémoires, passage de paramètres par pointeurs, flush des e/s, comportement de \n, protection contre le garbage, façon que scanf a de faire sa tokenization, etc. Et bien sûr, l'utilisation de size_t :)
 
Même si le premier programme c'est généralement "Hello World", c'est pas franchement le meilleur sujet pour démarrer... Il vaut mieux jouer à de l'arithmétique et des structures de controles simples pour commencer. Et je pense que c'est là le sujet de l'exercice de mcyrb.
 

Reply

Marsh Posté le 26-10-2004 à 17:11:37    

Lam's a écrit :


Pour convertir un caractère en chiffre, tu n'as qu'à remplacer :  
          r=atoi(&nb[k]);
par:
          r=nb[k]-'0';
 
Mais de toutes façons, ce n'est pas une bonne façon de faire ton exercice. Il serait plus rationnel de ne travailler que sur les entiers, sans passer par les chaîne au passage (en divisant pas 10, et en récupérant le reste, via modulo).
 
Ca devrait suffir pour commencer...


 
Merci beaucoup pour ta reponse  :)

Reply

Marsh Posté le 26-10-2004 à 20:04:29    

bravo bravo
 
simple lecteur anonyme de ce forum
débutant moi même en c
 
je constate une chose : l'absolu nulité de certains, Taz en tête jusque là
 
Taz > tu es peut être extrèmement bon, voir un génie dans ton domaine, mais tu es nul
très nul
déjà pour commencer apprend à lire, relis le premier post
Vous avez une règle ici qui prévaut sur tout : on aide à partir des efforts fournis par ceux qui le demandent.
Toi tu es sec, tes réponses sont courtes voir méprisantes (à ton image?). Et ceci très souvent voir tout le temps.
mcyrb indique la base de son parcours : noob en c, il a effectué des recherches, peut être mal, mais il a fait l'effort, donc la moindre des choses c'est être relax  ET pédagogue.
 
mcyrb > parceque je débute moi aussi je me suis donné un champs restrictif d'apprentissage, bon ou mauvais qui sait, regarde ce que tu peux trouver sur l'ansi-C et les fonctions et bibliothèques fournies avec, et pourquoi la plus part prêche par le standard à raison.
cherche sur http://fr.wikipedia.org/  
=> Bibliothèque C ANSI
=> langage C
regarde sur www.developpez.com il y a des tutos assez interessant (il faut bien commencer quelque part)
 
à partir de là tu verras que bien des choses semblent très interessantes dans la glibc que je te laisse chercher aussi.


Message édité par Attilagab le 26-10-2004 à 20:10:35
Reply

Marsh Posté le 26-10-2004 à 20:04:29   

Reply

Marsh Posté le 26-10-2004 à 20:20:32    

attilagab a écrit :


Toi tu es sec, tes réponses sont courtes

un bon rapport signal/bruit en somme  

attilagab a écrit :


méprisantes (à ton image?).

je te méprises pour ce genre de réflexion.

Reply

Marsh Posté le 26-10-2004 à 20:23:49    

Taz a écrit :

 
je te méprises pour ce genre de réflexion.


 
facil à titiller, bien
du moment que ton discourt s'arrange

Reply

Marsh Posté le 27-10-2004 à 01:19:01    

ca m'excite tout ca

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed