Séparer une chaine de caractère en C [Résolu/Fermé]

Signaler
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
-
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
-
Bonjours,

J'ai comme projet imposé la création d'un calculatrice en C (pas original je sais).
Mon problème c'est que l'utilisateur doit entrer ton son calcule lui même
Exemple: 2+3+9*3/9

Alors le seul moyen que je vois c'est une chaine de caractère (Si vous avez d'autre idée je suis toute oui :P)

Alors je voudrais savoir quelle est la fonction qui permet de séparer une chaine de caractère, pour que je puisse analyser chaque caractère et gérer mes calcule.


Merci

14 réponses

Messages postés
6118
Date d'inscription
jeudi 9 juillet 2009
Statut
Contributeur
Dernière intervention
20 mars 2017
1 529
Bonjour,

La fonction substr() permet de couper une chaine de caractère:

Prototype:

char* substr(char* chaine, int début, int longueur)

pour info, un tableau de caractère en C/C++ débute à 0.
5
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 76687 internautes nous ont dit merci ce mois-ci

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 720
Bonjour,

Tu dois effectivement passer par une chaîne de caractère.
De plus, tu vas devoir passer par une pile pour l'évaluation de la chaîne.
Pour extraire les caractères, il faudra tester si le code ascii est un opérateur ('+',...), une parenthèse, ou un nombre.
Cdlt,
Messages postés
6118
Date d'inscription
jeudi 9 juillet 2009
Statut
Contributeur
Dernière intervention
20 mars 2017
1 529
Lorsque tu détecte un "(", tu récupère la chaine jusqu'à ")" et tu traites ça en priorité... après s'il y a une accumulation de "()", cela risque de devenir compliqué...

La gestion des parenthèse est-elle obligatoire ou es-ce du zèle ?

"Trotti Trotta, Monsieur P, y'a des anges qui veulent un bisou..."
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 720
Non ce n'est pas comme ça qu'il faut faire. Il faut passer par une pile. Ainsi il n'y aura aucun problème d'accumulation de parenthèses.
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
16
Mais les parenthèses sont dans la donnée du projet mais je pourrai me pencher dessus une fois les autres points fini
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
16
Je croix que j'ai trouver.

je vais faire Neliel a dit et je vais voire après comment gérer les parenthèse.

Merci pour votre aide
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 720
C'est une mauvaise idée.
La gestion d'une calculatrice de ce type consiste à gérer la notation infix. Je voulais te laisser chercher un peu pour que tu découvres ce nom. Pour cela, tu dois passer par une pile.
Tu empiles petit à petit les éléments et dès que tu rencontres certains caractères qui sont moins prioritaire, tu peux dépiler et évaluer petit à petit.
J'en dis pas plus pour l'algorithme, pleins de site explique ceci en détail.
En tout cas, un conseil : ne pars pas sur la piste de Neliel parce que d'une part ton algorithme sera limité (concernant justement la gestion des prioriétés en cascade), et que tu devras refaire le programme en entier pour gérer la pile.
Surtout que s'il s'agit d'un projet, les profs attendent la pile. C'est un grand classique de la programmation.

Cdlt,
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
16
Merci beaucoup :D
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
16
Merci de ta réponse.

je vais essayer ;)

Mais tu aura pas une autre solution pour mon projet, pour que l'utilisateur puisse entrer son calcule, autre qu'un chaine de caractère??
Messages postés
6118
Date d'inscription
jeudi 9 juillet 2009
Statut
Contributeur
Dernière intervention
20 mars 2017
1 529
En C++, il y aurait eu peut-être une autre solution... je dis bien peut-être.
L'utilisateur peut-il entrer des parenthèses ?
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
16
Oui il peut , je dois ensuite gérer la priorité des opérations, mais je me suis dit que je gérerai sa le temps venu.

seul petit HIC, je doit le faire En C et non en C++, car le module que j'étudie se base sur le C.
Messages postés
6118
Date d'inscription
jeudi 9 juillet 2009
Statut
Contributeur
Dernière intervention
20 mars 2017
1 529
En C++, tu peux utiliser des modules du C.
Tu peux même faire de la programmation séquentielle en C++ comme le C.

Tu peux aussi utilisé les listes chaînés mais ça implique un traitement de la formule un peu plus complexe qu'avec un tableau de caractère.
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
16
J'ai viens de voir un truc intéressant

double atof(const char *nptr);

Es-que ca peut marcher si je convertis ma chaine en double et ensuite la priorité des opérations sera gérer automatiquement par le C??

(je suis apprenti informaticien première année, donc je connais pas tout en C, merci de ta compréhension )
Messages postés
6118
Date d'inscription
jeudi 9 juillet 2009
Statut
Contributeur
Dernière intervention
20 mars 2017
1 529
Le problème du C, c'est qu'il n'existe pas de type de variable gérant les chaînes de caractères.... il faut passer par un tableau de caractère.

Je ne vois pas trop en quoi convertir ta chaîne en double pourrait t'aider...
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
16
Ah OK.

Je penser que vu que dans ma chaine de caractère il y aurai que des chiffres et des opérateurs, je pourrai les convertir et comme sa les utilisés comme nombre et les calculer bêtement. Mais ca marche pas vraiment.
Messages postés
6118
Date d'inscription
jeudi 9 juillet 2009
Statut
Contributeur
Dernière intervention
20 mars 2017
1 529
Évidemment que ça ne fonctionne pas...
Tu peux facilement convertir le caractère "1" en chiffre 1... cette fonction sert d'ailleurs à ça... mais convertir le caractère "+" ou "-", d'après toi, ce sera exploitable ?
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
16
Non je pense pas.

Alors je peux faire comment pour que ca marche. que quand l'utilisateur entrer
2+6+3 que sa fasse 11 mais je vois pas trop comment y arriver
Messages postés
181
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
30 avril 2013
16
D'accord, je comprend ce que tu voulais dire par "Une pile pour l'évaluation de la chaine".

Donc je regarder chaque caractère de la chaine pour extraire les éléments.
Mais comment je doit faire pour gérer la priorité des opérations