1 votes

extraire des chiffres et des caractères d'une chaîne de caractères qui ne suit pas un format spécifique ? (calculatrice postfixe)

J'ai du mal à séparer les chiffres et les caractères de ma chaîne de saisie. Le but de mon programme est d'ajouter, de soustraire, de multiplier et de diviser en postfix Je ne peux donc pas prédire le formulaire d'entrée, car il peut être n'importe quoi entre 2 2 3 + * (la réponse étant 10) a 2 2 + 3 * (la réponse étant 12) . Je ne peux donc pas utiliser sscanf pour extraire les chiffres et le caractère opérateur sans avoir un format spécifique pour la chaîne d'entrée. Que dois-je faire ici ?

2voto

High Performance Mark Points 49691

Pour traiter Postfix, vous allez devoir mettre en place une pile, vous devez donc pousser chaque nombre sur une pile au fur et à mesure que vous l'obtenez, chaque opérateur en retire deux de la pile et repousse le résultat.

2voto

John Knoeller Points 20754

Une façon de procéder est d'utiliser scanf("%s") qui renvoie les caractères jusqu'au prochain espace blanc. Ou vous pouvez utiliser getc pour prendre les personnages un par un.

éditer :

Je vois dans les commentaires que vous utilisez gets pour lire une ligne entière, dans ce cas, vous feriez mieux d'utiliser strtok dans une boucle pour découper la ligne en jetons et ensuite regarder le premier caractère de chaque jeton pour décider ce qu'il faut en faire.

char line[MAX_LINE];
// read in the line 

char * pTok = strtok(line, " \t");
while (pTok)
{
    char ch = pTok[0];
    if (isdigit(ch))
       //handle number

    if (ch == '+')
       //handle addition operator

    ...
    pTok = strtok(NULL, " \t");
}

0voto

Tronic Points 6457

Je vous recommande d'utiliser Boost.Spirit Qi, qui est une bibliothèque d'analyseur syntaxique très agréable. Le premier exemple est une calculatrice...

http://www.boost.org/doc/libs/1_42_0/libs/spirit/doc/html/spirit/introduction.html

Une solution uniquement pour les bibliothèques standard :

// Get a line of user input (simplifies I/O)
std::string line;
if (!std::getline(std::cin, line)) throw std::runtime_error("Unable to read line");
// Process the line as an input string stream
std::istringstream iss(line);
while (true) {
    unsigned int val;
    if (iss >> val) {
        // TODO: Handle a numeric value (in val)
        continue;
    }
    iss.clear(); // Clear the error state
    char ch;
    if (!iss.get(ch)) break; // Break the loop if there is no more input
    // TODO: Handle a character (in ch)
}

0voto

Vatine Points 8884

Je ferais probablement cela en saisissant une ligne entière, puis j'aurais une fonction prenant une chaîne, un décalage et une structure de retour. La structure de retour contient l'offset de début et de fin du jeton, le type de jeton (opérateur, argument) et éventuellement d'autres éléments.

Vous pouvez également la diviser en deux fonctions, l'une vérifiant la présence d'un nombre et l'autre celle d'un opérateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X