fork download
  1. #include <cctype>
  2.  
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <string>
  6.  
  7. using namespace std::string_literals;
  8. using std::endl; using std::cout; using std::cerr;
  9.  
  10. auto parse_string_to_int(const std::string& str)
  11. {
  12. std::size_t num_processed = 0;
  13. int val = std::stoi(str, &num_processed, 10);
  14.  
  15. auto next_non_space = std::find_if(str.begin() + num_processed, str.end(),
  16. [](char ch) { return !std::isspace(ch); });
  17.  
  18. if (next_non_space != str.end())
  19. throw std::invalid_argument{"extra trailing characters in parse_string_to_int"};
  20.  
  21. return val;
  22. }
  23.  
  24. struct Product_token
  25. {
  26. std::string name;
  27. int value;
  28. };
  29.  
  30. auto get_next_product(std::string::const_iterator& begin, std::string::const_iterator end)
  31. -> Product_token
  32. {
  33. // match `"name" : value "`
  34. auto name_open_quote = std::find(begin, end, '\"');
  35. auto name_close_quote = std::find(name_open_quote + 1, end, '\"');
  36. auto colon = std::find(name_close_quote, end, ':');
  37. auto next_token_open_quote = std::find(colon, end, '\"');
  38.  
  39. if (name_close_quote == end || name_close_quote == end || colon == end)
  40. {
  41. throw std::invalid_argument{"syntax error on parsing product"};
  42. }
  43.  
  44. // advance to next token
  45. begin = next_token_open_quote;
  46.  
  47. return Product_token{{name_open_quote + 1, name_close_quote},
  48. parse_string_to_int({colon + 1, next_token_open_quote})};
  49. }
  50.  
  51. auto process_products(const std::string& str)
  52. {
  53. auto begin = str.begin();
  54.  
  55. while (begin != str.end())
  56. {
  57. auto product = get_next_product(begin, str.end());
  58. cout << '"' << product.name << "\" = " << product.value << endl;
  59. }
  60. }
  61.  
  62. int main()
  63. {
  64. auto str = R"("name1":1234 " name2 " : 23456 "name3" : 12345)"s;
  65.  
  66. try
  67. {
  68. process_products(str);
  69. }
  70. catch (std::exception& e)
  71. {
  72. cerr << e.what() << endl;
  73. }
  74. }
Success #stdin #stdout 0s 15232KB
stdin
Standard input is empty
stdout
"name1" = 1234
" name2  " = 23456
"name3" = 12345