2017-09-25 3 views
1

Cette fonction est un travail en cours conçu pour lire les données de stdin pour une calculatrice simple simple. La fonction fonctionne comme prévu lors de la saisie d'un opérateur et de deux opérandes: + 2 2. Elle lit aussi correctement à partir d'un fichier avec un formatage similaire sur la ligne de commande. Malgré cela, il segfualt si l'utilisateur frappe entrer sur la ligne de commande ou il atteint la fin d'un fichier. Je ne suis pas sûr d'où je me suis trompé? Qu'est-ce qui pourrait causer ce comportement?La fonction provoque une erreur de segmentation uniquement lorsque vous appuyez sur Entrée ou qu'elle atteint la fin d'un fichier.

void process_input() 
{ 

while(!std::cin.eof()) 
{ 
    std::string line; 
    std::string n; 


    getline(std::cin, line); 


    if (std::cin.fail()) 
     break; 
    else if (line == "quit") 
     return; 

    std::istringstream stream(line); 
    std::vector<std::string> input_cpy(0); 
    while (stream >> n) 
     input_cpy.push_back(n); 

    //Clear global_input_cpy on each iteration and load the new line into it 
    global_input_cpy.clear(); 
    for (int i = 0; i < input_cpy.size(); ++i) 
     global_input_cpy.push_back(input_cpy[i]); 



    if(input_cpy[0] == "+") 
     sum(std::stol(input_cpy[1]), std::stol(input_cpy[2])); 
    else if (input_cpy[0] == "*") 
     multiply(std::stol(input_cpy[1]), std::stol(input_cpy[2])); 
    else if (input_cpy[0] == "^") 
     exponent(std::stol(input_cpy[1]), std::stol(input_cpy[2])); 
    else 
     std::cout << "input '" << input_cpy[0] << "'" << " unrecognized. skipping." << "\n"; 

    input_cpy.clear(); 
} 
} 
+0

S'il vous plaît donner un exemple complet. 'global_input_cpy' n'est pas déclaré,' sum', 'multiply',' exponent' ne sont pas définis. –

+0

'while (! Std :: cin.eof())' ne vous mordra probablement pas ici, mais sachez que cela peut conduire à des bugs intéressants et beaucoup de tiraillements. Plus ici: [Pourquoi iostream :: eof est-il dans une condition de boucle considérée comme incorrecte?] (Https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – user4581301

Répondre

4

Si aucune des chaînes sont lues et donc input_cpy est vide, vous essayez toujours d'accéder input_cpy[0] et ce produit un comportement non défini.

Vous avez besoin d'une affirmation quelque part que input_cpy.size() >= 2 pour que ces déclarations ont un comportement défini:

if(input_cpy[0] == "+") 
    sum(std::stol(input_cpy[1]), std::stol(input_cpy[2])); 
else if (input_cpy[0] == "*") 
    multiply(std::stol(input_cpy[1]), std::stol(input_cpy[2])); 
else if (input_cpy[0] == "^") 
    exponent(std::stol(input_cpy[1]), std::stol(input_cpy[2])); 
+0

Travaillé comme un charme! Je vous remercie! –