fork download
  1. #include <iostream>
  2. #include <regex>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9. // Объявляем переменные, в которые будут записываться данные
  10. int a = 0;
  11. int b = 0;
  12. int c = 0;
  13.  
  14. // Объявляем "разборщик" строки в виде регулярного выражения. В данном случае мы говорим,
  15. // что строка должна соответствовать формату "x=num", где x должно быть одним из символов
  16. // 'a', 'b' или 'c' (паттерн [abc]), а num - последовательность из цифр (паттерн [\\d]+)
  17. // Взятие паттернов в скобки означает, что мы хотим получить их в качестве результата разбора
  18. std::regex parseRegex(R"(\s*([abc])\s*=\s*([+-]?\d+)\s*)");
  19. std::smatch baseMatch;
  20. for (;;)
  21. {
  22. // Читаем полную строку с консоли. Если пользователь ввёл "exit", то
  23. // больше ничего не читаем.
  24. std::string line;
  25. std::getline(std::cin, line);
  26. if (line == "exit")
  27. break;
  28.  
  29. // Разбираем прочитанную строку с помощью регулярного выражения. Если
  30. // строка не соответствует ожидаемому формату - сообщаем об этом.
  31. if (!std::regex_match(line, baseMatch, parseRegex))
  32. {
  33. std::cout << "Can't match the string! Invalid string format." << std::endl;
  34. continue;
  35. }
  36.  
  37. // Если количество полученных результатов разбора меньше требуемого - также
  38. // сообщаем об ошибке
  39. if (baseMatch.size() != 3)
  40. {
  41. std::cout << "Invalid string format." << std::endl;
  42. continue;
  43. }
  44.  
  45. // Получаем результаты разбора
  46. auto varName = baseMatch[1].str();
  47. auto varValueStr = baseMatch[2].str();
  48. // Конвертируем последовательность цифр в число
  49. auto varValue = atoi(varValueStr.c_str());
  50.  
  51. // В зависимости от того, какое имя переменной ввели с консоли,
  52. // присваиваем значение соответствующей переменной
  53. if (varName == "a")
  54. a = varValue;
  55. else if (varName == "b")
  56. b = varValue;
  57. else if (varName == "c")
  58. c = varValue;
  59.  
  60. // Для контроля выводим состояние переменных
  61. std::cout << "a = " << a << std::endl;
  62. std::cout << "b = " << b << std::endl;
  63. std::cout << "c = " << c << std::endl;
  64. }
  65. return 0;
  66. }
Success #stdin #stdout 0s 16168KB
stdin
a=10
b=20
awefawef
c=40
 a= 50
b = -70 
c= +80
e=30
g=awef
exit
stdout
a = 10
b = 0
c = 0
a = 10
b = 20
c = 0
Can't match the string! Invalid string format.
a = 10
b = 20
c = 40
a = 50
b = 20
c = 40
a = 50
b = -70
c = 40
a = 50
b = -70
c = 80
Can't match the string! Invalid string format.
Can't match the string! Invalid string format.