fork(1) download
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <vector>
  5.  
  6. int main() {
  7. std::string str("0=My,1=comma,2=separated,3=string,0=with,3=repeated,7=IDs");
  8. std::vector<std::string> out0;
  9. std::map<std::string, std::string> out;
  10.  
  11. size_t startPos = 0, delimPos, nameStart, nameEnd, valueStart, valueEnd;
  12.  
  13. // loop over the string, collecting "key=value" pairs
  14. while (startPos < str.size()){
  15. nameStart = startPos;
  16. delimPos = str.find_first_of("=,", startPos, 2);
  17. if (delimPos == std::string::npos) {
  18. nameEnd = valueStart = valueEnd = str.size();
  19. }
  20. else {
  21. nameEnd = delimPos;
  22. if (str[delimPos] == '=') {
  23. valueStart = nameEnd + 1;
  24. valueEnd = str.find(',', valueStart);
  25. if (valueEnd == std::string::npos) {
  26. valueEnd = str.size();
  27. }
  28. }
  29. else {
  30. valueStart = valueEnd = nameEnd;
  31. }
  32. }
  33.  
  34. // TODO: if needed, adjust nameStart/End and valueStartEnd to
  35. // ignore leading/trailing whitespace around the name and value
  36. // substrings...
  37.  
  38. if (str.compare(nameStart, nameEnd - nameStart, "0", 1) == 0) {
  39. out0.push_back(str.substr(valueStart, valueEnd - valueStart));
  40. } else {
  41. out[str.substr(nameStart, nameEnd - nameStart)] = str.substr(valueStart, valueEnd - valueStart);
  42. }
  43.  
  44. startPos = valueEnd + 1;
  45. }
  46.  
  47. // print out the data structures
  48. std::cout << "out0:";
  49. for (auto& entry : out0) {
  50. std::cout << ' ' << entry;
  51. }
  52. std::cout << std::endl;
  53.  
  54. std::cout << "out:";
  55. for (auto &it : out) {
  56. std::cout << ' ' << it.first << '=' << it.second;
  57. }
  58. }
  59.  
Success #stdin #stdout 0s 4372KB
stdin
Standard input is empty
stdout
out0: My with
out: 1=comma 2=separated 3=repeated 7=IDs