Here is what I implemented form last time and this code is working for most of my test cases but it is not working for these cases.
#include <climits>
#include <cmath>
#include <iostream>
#include <limits>
#include <stdexcept>
#include <string>
#include <vector>
long long ConvertStringToNumber(std::string number) {
long long int finalNumber = 0;
bool isNegative = false;
int i = 0;
if (number.at(0) == '-') {
isNegative = true;
i++;
}
for (; i < number.length(); i++) {
if (number.at(i) < '0' || number.at(i) > '9') {
throw std::invalid_argument("Some error...");
}
if (finalNumber >
(std::numeric_limits<long long int>::max() - (number.at(i) - '0')) / 10) {
throw std::overflow_error("Input string contains a number that is too large!!!");
throw std::range_error("Number is too large");
}
finalNumber = finalNumber * 10 + (number.at(i) - '0');
}
return isNegative ? -finalNumber : finalNumber;
}
std::vector<long long int> NumbersInString(std::string s) {
std::vector<long long int> numbers;
std::string currentNumber = "";
bool isNumber = true;
for (int i = 0; i < s.length(); i++) {
char c = s.at(i);
if ((c >= '0' && c <= '9') || c == '-') {
currentNumber += c;
isNumber = true;
} else if (isNumber) {
if (!(currentNumber.size() == 0) &&
((currentNumber != "-" && currentNumber.at(0) == '-') ||
(currentNumber.at(0) >= '0' && currentNumber.at(0) <= '9'))) {
if (i == s.length() || ((s.at(i) < 'a' || s.at(i) > 'z') &&
(s.at(i) < 'A' || s.at(i) > 'Z'))) {
try {
long long int number = ConvertStringToNumber(currentNumber);
numbers.push_back(number);
} catch (std::domain_error &k) {
// skip it
}
}
}
currentNumber = "";
isNumber = false;
}
}
if (isNumber && !currentNumber.empty()) {
try {
long long int number = ConvertStringToNumber(currentNumber);
numbers.push_back(number);
} catch (std::domain_error &e) {
}
// skip again
}
return numbers;
}
int main() {
std::string input;
std::cout << "Enter a string: ";
std::getline(std::cin, input);
try {
std::vector<long long int> numbers = NumbersInString(input);
if (numbers.empty()) {
std::cout << "The entered string does not contain any numbers!\n";
} else {
std::cout << "Numbers within the string: ";
for (long long int number : numbers) {
std::cout << number << " ";
}
std::cout << std::endl;
}
} catch (std::overflow_error &e) {
std::cout << "PROBLEM: " << e.what() << std::endl;
} catch (std::range_error &k) {
std::cout << "Exception with message:" << k.what();
}
return 0;
}
Can someone please give explanation and help for these cases here is the output: Enter a string: -123 123-123 123- 123 terminate called after throwing an instance of 'std::invalid_argument' what(): Some error... Aborted
=== Code Exited With Errors === Here is the correct output: -123 123-123 123- 123
and Enter a string: Ovo je 123456789012345678901234563 -90 test. PROBLEM: Input string contains a number that is too large!!!
=== Code Execution Successful ===
But output needs to be: Number too big! Can someone explain how to catch the exception and write different message then?