Atoi

pyn Messages postés 7 Statut Membre -  
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   -
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.

void saisie_pol()//fonction permettant la saisie du polynome
{
    Polynome pol_temp = {0,0};
    char chaine[TAILLE_MAX]={0};
    int i = 0, j, cas ;
    printf("Entrez votre polynome\n");
    scanf("%s",chaine);
    for (j=0; chaine[i]!='\0'; j++)
    {
        cas = 0;
        if (chaine[i]=='-')
        {
        pol_temp.monome[j].num *= -1;
        }
        if (chaine[i]=='-' || chaine[i]=='+')
        {
        i++;
        }
        for (; chaine[i]!='+' && chaine[i]!='\0' && chaine[i]!='-'; i++)
        {
            if (chaine[i]=='x')
            {
                continue;
            }
            if (chaine[i]=='/')
            {
                cas=1;
                continue;
            }
            if (chaine[i]=='^')
            {
                cas=2;
                continue;
            }
            if (cas==0) //pour gérer num, den et degre
            {
                pol_temp.monome[j].num = atoi(&chaine[i]) + pol_temp.monome[j].num*10;
            }
            else if (cas==1)
            {
                pol_temp.monome[j].den = atoi(&chaine[i]) + pol_temp.monome[j].den*10;
            }
            else if (cas==2)
            {
                pol_temp.monome[j].degre = atoi(&chaine[i]) + pol_temp.monome[j].degre*10;
            }
        }
                if (pol_temp.monome[j].num == 0 )
                pol_temp.monome[j].num = 1;
                if (pol_temp.monome[j].den == 0 )
                pol_temp.monome[j].den = 1;
        }
        pol_temp.nbmo=j;
        affiche_poly(pol_temp);
        save_pol(pol_temp);
}


Merci d'avance.

2 réponses

fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
As-tu pensé à utiliser sscanf ?
Par exemple :
sscanf("5*X^2+10*X+12","%lf*X%*c%lf*X%*c%lf",mon[2],mon[1],mon[0]);
cela récupérera les coefficients.
Après, à toi d'adapter à ton contexte. Il faut d'abord que tu évalues le

Sinon avec ta méthode, j'ai pas tout lu en détail. Mais je vois pas pourquoi tu mets atoi(&chaine[i]) ? Un simple atoi(chaine[i]) devrait marcher non ?
0
pyn Messages postés 7 Statut Membre
 
Pour ton exemple avec sscanf, le problème est que les polynomes rentrés peuvent être plus compliqué.
Ex : 5/7x^4-45/7+4x^4-x^7
Sinon sa aurait été évidemment bien plus simple.

Lorsque je met atoi(chaine[i]) le programme plante. Donc je suis obligé de rajouter un "&" devant la chaine.

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.
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Outch, j'ai dit une bêtise. Oui oui, il faut mettre atoi(&chaine[i]); ou atoi(chaine+i);
En fait je voudrais qu'atoi (ou autre) convertisse une saisie en chiffre mais caractères par caractères.
Concrètement, tu as char *ch="51*x^2+3";
Tu veux que la fonction te renvoie quoi ? 5, puis 1? ou 51 ?
0