fork download
  1. #include <iostream>
  2. #include <iterator>
  3. #include <vector>
  4. #include <regex>
  5.  
  6. std::vector<int> parse(const std::string &iStr) {
  7. std::vector<int> Ret;
  8. std::vector<std::string> Tmp;
  9. std::string Work(iStr);
  10. Work.erase(0,Work.find_first_not_of(' '));
  11. Work.erase(Work.find_last_not_of(' ')+1);
  12. if (Work.length() == 0) throw std::invalid_argument("Пустая строка");
  13. if (Work[0] == ',') throw std::invalid_argument("В первой позиции не число");
  14. if (Work[Work.length()-1] == ',') throw std::invalid_argument("В последней позиции не число");
  15. std::regex Rx("\\s*,\\s*");
  16. std::sregex_token_iterator Begin(Work.begin(), Work.end(), Rx, -1);
  17. std::sregex_token_iterator End;
  18. while (Begin != End) Tmp.push_back((Begin++)->str());
  19. Rx = "^\\s*((\\+|-)?[0-9]+)\\s*,?\\s*$";
  20. int Pos = 0;
  21. for(const auto &i:Tmp) {
  22. std::smatch Match;
  23. std::regex_search(i, Match, Rx);
  24. if (Match.size() == 3)
  25. try {
  26. Ret.push_back(std::stoi(Match.str(1),nullptr,10));
  27. } catch(...) {
  28. throw std::invalid_argument("В позиции "+std::to_string(Pos)+" слишком длинное число");
  29. }
  30. else throw std::invalid_argument("В позиции "+std::to_string(Pos)+" не число");
  31. Pos++;
  32. }
  33. return Ret;
  34. }
  35.  
  36. int main() {
  37. for(const auto &i: {
  38. "1, 4, 5, -6, -8 , 3, 1",
  39. "1, 3333333333333333333333333334, 5, -6, -8 , 3, 1",
  40. " 5 , 6, 57, +68 , 18, 32, 4 ",
  41. "77",
  42. "",
  43. " ",
  44. "1, 4, 5, 6, 8, 3, 1,",
  45. " , 6, 57, 68 , 18, 32, 4",
  46. "5, 6, , 68, 18, 32, 4",
  47. "5, 6,, 68, 18, 32, 4",
  48. "5, 6, T, 68, 18, 32, 4",
  49. "5, 6, 34T, 68, 18, 32, 4",
  50. "5, 6, 34 55, 68, 18, 32, 4",
  51. ",",
  52. ",,",
  53. ",, ,, ,,,"}) {
  54. try {
  55. std::cout << "\"" << i << "\": ";
  56. parse(i);
  57. std::cout << "Ok";
  58. } catch (std::invalid_argument &E) {
  59. std::cout << E.what();
  60. }
  61. std::cout << std::endl;
  62. }
  63. return 0;
  64. }
Success #stdin #stdout 0.01s 3560KB
stdin
Standard input is empty
stdout
"1, 4, 5, -6, -8 , 3, 1": Ok
"1, 3333333333333333333333333334, 5, -6, -8 , 3, 1": В позиции 1 слишком длинное число
"       5 , 6, 57, +68 , 18, 32, 4   ": Ok
"77": Ok
"": Пустая строка
"    ": Пустая строка
"1, 4, 5, 6, 8, 3, 1,": В последней позиции не число
" , 6, 57, 68 , 18, 32, 4": В первой позиции не число
"5, 6, , 68, 18, 32, 4": В позиции 2 не число
"5, 6,, 68, 18, 32, 4": В позиции 2 не число
"5, 6, T, 68, 18, 32, 4": В позиции 2 не число
"5, 6, 34T, 68, 18, 32, 4": В позиции 2 не число
"5, 6, 34 55, 68, 18, 32, 4": В позиции 2 не число
",": В первой позиции не число
",,": В первой позиции не число
",, ,, ,,,": В первой позиции не число