2017-09-13 21 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 :: noskipws'を先に使用しない限り、' std :: ws'を使うのは冗長です。 –

答えて

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はこのコードでは有効な入力ではありません。そのようにするには、コンマで区切られた数字に加えて、スペースで区切られた数字を扱うための特別なコードを追加する必要があります。

関連する問題