Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4577 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Atoi

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Atoi

n°2050060
Plame
Posté le 19-01-2011 à 02:16:18  profilanswer
 

Bonjour,  
 
J'ai un petit problème avec une partie de mon programme vu que je me suis un peu planté sur le fonctionnement de atoi().
J'ai cru que je pourrais analyser caracteres par caracteres la saisie envoyer à atoi mais visiblement ce dernier prend toute la chaine jusqu'à arriver à un \0 . Résultat rien ne marche comme je le voudrais et je me retrouve bloqué. Si quelqu'un voit une solution je suis tout ouïe.
 

Code :
  1. void saisie_pol()//fonction permettant la saisie du polynome
  2. {
  3.     Polynome pol_temp = {0,0};
  4.     char chaine[TAILLE_MAX]={0};
  5.     int i = 0, j, cas ;
  6.     printf("Entrez votre polynome\n" );
  7.     scanf("%s",chaine);
  8.     for (j=0; chaine[i]!='\0'; j++)
  9.     {
  10.         cas = 0;
  11.         if (chaine[i]=='-')
  12.         {
  13.         pol_temp.monome[j].num *= -1;
  14.         }
  15.         if (chaine[i]=='-' || chaine[i]=='+')
  16.         {
  17.         i++;
  18.         }
  19.         for (; chaine[i]!='+' && chaine[i]!='\0' && chaine[i]!='-'; i++)
  20.         {
  21.             if (chaine[i]=='x')
  22.             {
  23.                 continue;
  24.             }
  25.             if (chaine[i]=='/')
  26.             {
  27.                 cas=1;
  28.                 continue;
  29.             }
  30.             if (chaine[i]=='^')
  31.             {
  32.                 cas=2;
  33.                 continue;
  34.             }
  35.             if (cas==0) //pour gérer num, den et degre
  36.             {
  37.                 pol_temp.monome[j].num = atoi(&chaine[i]) + pol_temp.monome[j].num*10;
  38.             }
  39.             else if (cas==1)
  40.             {
  41.                 pol_temp.monome[j].den = atoi(&chaine[i]) + pol_temp.monome[j].den*10;
  42.             }
  43.             else if (cas==2)
  44.             {
  45.                 pol_temp.monome[j].degre = atoi(&chaine[i]) + pol_temp.monome[j].degre*10;
  46.             }
  47.         }
  48.                 if (pol_temp.monome[j].num == 0 )
  49.                 pol_temp.monome[j].num = 1;
  50.                 if (pol_temp.monome[j].den == 0 )
  51.                 pol_temp.monome[j].den = 1;
  52.         }
  53.         pol_temp.nbmo=j;
  54.         affiche_poly(pol_temp);
  55.         save_pol(pol_temp);
  56. }


 
 
Merci d'avance.

mood
Publicité
Posté le 19-01-2011 à 02:16:18  profilanswer
 

n°2050063
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 19-01-2011 à 03:28:05  profilanswer
 

Question pas précise quand même. Tu voudrais qu'atoi s'arrête avant le \0 ?
 
D'une de mémoire, atoi est dépréciée, il faut utiliser strtol (ou strtod je sais plus), qui s'arrête au dernier caractère numérique valide, ce qui résoudra peut être ton problème
 
De deux si tu as besoin de convertir un seul chiffre, tu peux simplement retrancher 48 à la valeur ascii du caractère, mais vu la gueule de ton code j'ai l'impression que c'est pas ce que tu recherches.
 
Maintenant si tu as des besoins plus spécifiques, il te faudra coder ta propre fonction (a moins, encore une fois, qu'une fonction dont j'ignore l'existence te permette de déterminer le caractère d'arrêt)
 
Mais j'imagine que strtol suffit à résoudre ton problème (même s'il me semblait qu'atoi s'arrêtait aussi au premier caractère non valide)


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2050149
Plame
Posté le 19-01-2011 à 10:54:57  profilanswer
 

En fait je voudrais qu'atoi (ou autre) convertisse une saisie en chiffre mais caractères par caractères.
Or actuellement même en lui envoyant atoi(chaine[i]) il me convertit toute la chaine jusqu'à un caractère qui n'est pas un chiffre.

n°2050153
Un Program​meur
Posté le 19-01-2011 à 11:02:24  profilanswer
 

WiiDS a écrit :

D'une de mémoire, atoi est dépréciée, il faut utiliser strtol (ou strtod je sais plus), qui s'arrête au dernier caractère numérique valide, ce qui résoudra peut être ton problème[/auotemsg]
l -> long d -> double.  
 
[quotemsg]De deux si tu as besoin de convertir un seul chiffre, tu peux simplement retrancher 48 à la valeur ascii du caractère, mais vu la gueule de ton code j'ai l'impression que c'est pas ce que tu recherches.


 
Tu peux me dire pourquoi 48 plutot que '0', a part introduire une dependance inutile sur l'implementation et obscurcir le code?
 

Plame a écrit :

En fait je voudrais qu'atoi (ou autre) convertisse une saisie en chiffre mais caractères par caractères.


 
Petit rappel de vocabulaire: chiffre: c'est le symbole, nombre c'est la valeur.  Chiffre correspond a lettre et nombre correspond a mot.
 
Si tu as un chiffre decimal dans une variable de type char c, tu peux en avoir la valeur en faisant c-'0'.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2050188
Plame
Posté le 19-01-2011 à 12:30:33  profilanswer
 

Oui merci c'était exactement sa qu'il me fallait :jap:  
 
Par contre j'ai une petite "erreur" dans une autre de mes fonctions.
Enfin pas une erreur à proprement parler mais juste un bug avec scanf.
 
Quand j'appelle cette fonction la première phrase apparait 2 fois. Je pense que sa vient du buffer, mais j'ai oublié quel était le code à écrire pour vider le buffer.
 

Code :
  1. void save_pol(Polynome poly_save)// permet de sauvegarder un polynome
  2. {
  3.     char slot;
  4.      do
  5.      {
  6.      printf("Dans quel slot voulez-vous sauvegarder ce polynome (A à J) ?" );
  7.      scanf("%c", &slot);
  8.      switch(slot)
  9.     {
  10.         case 'A':
  11.         A = poly_save;
  12.         break;
  13.         case 'B':
  14.         B = poly_save;
  15.         break;
  16.         case 'C':
  17.         C = poly_save;
  18.         break;
  19.         case 'D':
  20.         D = poly_save;
  21.         break;
  22.         case 'E':
  23.         E = poly_save;
  24.         break;
  25.         case 'F':
  26.         F = poly_save;
  27.         break;
  28.         case 'H':
  29.         H = poly_save;
  30.         break;
  31.         case 'I':
  32.         I = poly_save;
  33.         break;
  34.         case 'J':
  35.         J = poly_save;
  36.         break;
  37.         default:
  38.         break;
  39.     }
  40.      }
  41.      while(slot != 'A' && slot != 'B' && slot != 'C' && slot != 'D' && slot != 'E' && slot != 'F' && slot != 'G' && slot != 'H' && slot != 'I' && slot != 'J');
  42.      }

n°2050193
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 19-01-2011 à 12:45:44  profilanswer
 

Un Programmeur a écrit :


 
Tu peux me dire pourquoi 48 plutot que '0', a part introduire une dependance inutile sur l'implementation et obscurcir le code?
 


Implémentation je veux bien, mais obscurcir le code, '0' ou 48 ça reste aussi moche [:spamafote]


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2050205
Un Program​meur
Posté le 19-01-2011 à 13:58:48  profilanswer
 

Plame a écrit :

Quand j'appelle cette fonction la première phrase apparait 2 fois. Je pense que sa vient du buffer, mais j'ai oublié quel était le code à écrire pour vider le buffer.


 
Lis jusqu'a un '\n'.
 

WiiDS a écrit :

Implémentation je veux bien, mais obscurcir le code, '0' ou 48 ça reste aussi moche [:spamafote]


 
Dans le premier cas, le sens est clair, dans le deuxieme, il faut le savoir.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2050214
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 19-01-2011 à 14:20:34  profilanswer
 

Un Programmeur a écrit :


 
Dans le premier cas, le sens est clair, dans le deuxieme, il faut le savoir.


 
un str[i] - '0' je trouve pas ça super clair non plus, faut un minimum connaître l'astuce et quand on la connaît je doute que - 48 fassent plus étrange.


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Atoi

 

Sujets relatifs
fonction atoi, 00:00 en entréedéfinir un polynome à l'aide de la fonction "atoi" avec des listes
Fonction 'atoi()" en Ada [RESOLU][C] l'inverse de atoi() ?
Help : atoi... ou la convertion de char en int.question atoi
Plus de sujets relatifs à : Atoi


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)