2017-09-13 7 views
0

Mon code permet à l'utilisateur d'entrer des nombres, il les trie et les sort dans l'ordre.Se débarrasser des espaces blancs (C++)

entrée Exemple: 25,1,3-6
Exemple de sortie: 1,3,4,5,6,25

Toutefois, lorsque les entrées de l'utilisateur quelque chose comme 2 5,1,3-6, et s'il y a un espace dans un cas comme 3 - 6, le programme ne fonctionne pas.

J'ai utilisé cin>>ws; pour essayer de me débarrasser des espaces, mais cela ne fonctionne pas.

Voici la partie du code lié à cette question (il y a quelques autres fonctions que je ne mentionnaient pas, à moins qu'ils ne semblent la source du problème):

#include <iostream>  
#include <string>  
#include <cctype>  
#include <vector> 

using namespace std; 

void get_nums(vector<int>& num_vec); 

int main() 
{ 
    int num1; 
    int num2; 
    cout << "\n Please, enter your HW: "; 
    vector<int> num_vec; 
    cin>>ws; 
    cout.flush(); 
    do 
    { 
     cin>>ws; 
     cin>>num1; 
     num_vec.push_back(num1); 
     if(cin.peek() == ',') 
     {  
      cin.ignore(); 
     } 
     else if(cin.peek() == '-') 
     { 
      cin.ignore(); 
      cin>>num2; 
      for(++num1; num1<=num2; num1++) 
      { 
       num_vec.push_back(num1); 
      } 
      if(cin.peek() == ',') 
      { 
       cin.ignore(); 
      }  
     } 
    } 
    while (cin.peek() != '\n'); 

    cout<< "\n Do Problems: "; 
    for(int z=0; z<num_vec.size(); z++) 
    { 
     if(z+1==num_vec.size()) 
     { 
      cout<<num_vec[z]; 
     } 
     else if(z+2==num_vec.size()) 
     { 
      cout<<num_vec[z]<<",and "; 
     } 
     else 
     { 
      cout<<num_vec[z]<<", "; 
     } 
    } 

    return 0; 
} 
+2

Essayer d'utiliser des opérations d'entrée formatées de haut niveau rend les choses plus compliquées. Il sera beaucoup plus facile d'analyser ce type de caractère d'entrée par caractère. –

+0

'operator >>' ignore déjà les espaces par défaut, donc utiliser 'std :: ws' est redondant, sauf si vous utilisez d'abord' std :: noskipws'. –

Répondre

2

J'utiliserais std::getline() à lire en une seule entrée entière de l'utilisateur, puis utilisez std::istringstream pour l'analyser, par exemple:

#include <iostream> 
#include <string> 
#include <sstream> 
#include <vector> 
#include <algorithm> 

void get_nums(std::vector<int> &num_vec) 
{ 
    std::string line, tokens; 

    std::getline(std::cin, line); 
    std::istringstream input(line); 

    while (std::getline(input, tokens, ',')) 
    { 
     std::istringstream values(tokens); 
     int num; 

     if (!(values >> num)) 
      continue; 

     values >> std::ws; 
     char ch = values.peek(); 

     if (ch == '-') 
     { 
      values.ignore(); 

      int num2; 
      if (!(values >> num2)) 
       continue; 

      while (num <= num2) 
       num_vec.push_back(num++); 
     } 
     else if (ch == std::char_traits<char>::eof()) 
      num_vec.push_back(num); 
    } 
} 

int main() 
{ 
    std::vector<int> num_vec; 

    std::cout << "\n Please, enter your HW: " << std::flush; 
    get_nums(num_vec); 

    if (!num_vec.empty()) 
    { 
     std::sort(num_vec.begin(), num_vec.end()); 

     std::cout << "\n Do Problems: "; 

     std::cout << num_vec[0]; 

     for(int z = 1; z < num_vec.size(); ++z) 
     { 
      std::cout << ", "; 

      if ((z+1) == num_vec.size()) 
       std::cout << "and "; 

      std::cout << num_vec[z]; 
     } 
    } 
    else 
     std::cout << "\n No Input! "; 

    return 0; 
} 

entrée: 25,1,3-6
sortie: 1,3,4,5,6,25

entrée: 25,1,3 - 6
sortie: 1,3,4,5,6,25

entrée: 2 5, 1 , 3- 6
sortie: 1,3,4,5,6

: 2 5 est pas entrée valide dans ce code. Si vous le souhaitez, vous devrez ajouter du code supplémentaire pour gérer les nombres délimités par des espaces, en plus des nombres délimités par des virgules.