Website Summary Files Commits Branches @commit @diff @stats
path: root / Week01 / Exercise03 / ioHelpers.cpp
diff options
context:
space:
mode:
Commitfcf38e62e8160f2c9901bdfd33760afed28beb8d (patch)
Author
 Syndamia <kamen@syndamia.com>
2026-02-22 19:18:46 +0200
Committer
 Syndamia <kamen@syndamia.com>
2026-02-22 19:18:46 +0200
Files838fd5897d88700491a389cdf6837e35da3347ae /Week01/Exercise03/ioHelpers.cpp
oop-2025-solutions-fcf38e62e8160f2c9901bdfd33760afed28beb8d.tar
oop-2025-solutions-fcf38e62e8160f2c9901bdfd33760afed28beb8d.tar.gz
oop-2025-solutions-fcf38e62e8160f2c9901bdfd33760afed28beb8d.zip
Parentc365ede952f852c6e8feb92fc3a0766186f989f1 (diff)
feat(Week01): Add solutions
1 files changed, 57 insertions, 0 deletions
-rw-r--r--Week01/Exercise03/ioHelpers.cpp57
diff --git a/Week01/Exercise03/ioHelpers.cpp b/Week01/Exercise03/ioHelpers.cpp
new file mode 100644
index 0000000..caf63fe
--- /dev/null
+++ b/Week01/Exercise03/ioHelpers.cpp
@@ -0,0 +1,57 @@
+#include <iostream>
+#include "ioHelpers.h"
+#include "stringHelpers.h"
+
+int readInteger(const char* prompt, int min, int max) {
+ std::cout << prompt;
+
+ int value;
+ std::cin >> value;
+
+ while (value < min || max < value) {
+ std::cout << "Value must in range [" << min << ", " << max << "]! Try again... " << std::endl;
+ std::cin >> value;
+ }
+
+ return value;
+}
+
+double readDouble(const char* prompt, double min, double max) {
+ std::cout << prompt;
+
+ double value;
+ std::cin >> value;
+
+ while (value < min || max < value) {
+ std::cout << "Value must in range [" << min << ", " << max << "]! Try again... " << std::endl;
+ std::cin >> value;
+ }
+
+ return value;
+}
+
+char* readString(const char* prompt) {
+ std::cout << prompt;
+
+ const unsigned BUFFER_SIZE = 1024;
+ char buffer[BUFFER_SIZE];
+
+ // Когато правим "std::cin >> x", std::cin чете само нужния брой знаци за x,
+ // докато std::cin.getline чете от последната позиция нататък.
+ // Тоест, ако направим например "std::cin >> integerValue" и след това
+ // "std::cin.getline(...)" и входа ни е "5 ABC", тогава първото std::cin
+ // ще прочете само 5-цата и getline ще запише " ABC".
+ // Когато обаче имаме нов ред, тоест еквивалентно на "5\nABC", тогава
+ // getline ще почне да чете от "\nABC", ще види това "\n" и ще запише
+ // празния низ "".
+ // std::cin.peek() връща текущата буква, без да премества напред четенето,
+ // std::cin.ignore() игнорира една буква (т.е. четенето продължава след нея).
+ // Общо взето, това долу игнорира знак за нов ред, ако сме срещнали такъв.
+ // Това оправя ситуацията, когато получаваме "First name: Last name: ".
+ if (std::cin.peek() == '\n')
+ std::cin.ignore();
+
+ std::cin.getline(buffer, BUFFER_SIZE);
+
+ return newString(buffer);
+}