Atoi

Atoi - C - Programmation

Marsh Posté le 19-01-2011 à 02:16:18    

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.

Reply

Marsh Posté le 19-01-2011 à 02:16:18   

Reply

Marsh Posté le 19-01-2011 à 03:28:05    

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
Reply

Marsh Posté le 19-01-2011 à 10:54:57    

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.

Reply

Marsh Posté le 19-01-2011 à 11:02:24    

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)
Reply

Marsh Posté le 19-01-2011 à 12:30:33    

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.      }

Reply

Marsh Posté le 19-01-2011 à 12:45:44    

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
Reply

Marsh Posté le 19-01-2011 à 13:58:48    

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)
Reply

Marsh Posté le 19-01-2011 à 14:20:34    

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
Reply

Sujets relatifs:

Leave a Replay

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