2017-09-13 187 views
0

我的代码允许用户输入数字,对它们进行排序并按顺序输出。摆脱空白(C++)

示例输入:25,1,3-6
输出示例:1,3,4,5,6,25

然而,当用户输入类似2 5,1,3-6,并且如果在像3 - 6的情况下的空间,程序不工作。

我用cin>>ws;试图摆脱空白,但它不工作。

这里是(有一些其他的功能,我不包括,除非他们似乎对这个问题的来源)与此问题相关的代码部分:

#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

试图在这里使用高级格式化的输入操作只会使事情变得更加复杂。按字符分析这种输入字符会容易得多。 –

+0

'operator >>'在默认情况下已经忽略了空格,所以使用'std :: ws'是多余的,除非你先使用'std :: noskipws'。 –

回答

2

我会用std::getline()来读取用户的整个输入一气呵成,然后用std::istringstream解析它,例如:

#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; 
} 

输入:25,1,3-6
输出:1,3,4,5,6,25

输入:25,1,3 - 6
输出:1,3,4,5,6,25

输入:2 5, 1 , 3- 6
输出:1,3,4,5,6

2 5不在此代码有效输入。如果你想要它,除了用逗号分隔的数字之外,你将不得不添加一些额外的代码来处理空格分隔的数字。