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 ?
Réponses
Trop de publicités?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");
}
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)
}
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.