Extracting long long int numbers from string and putting them in vector

74 Views Asked by At

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?

0

There are 0 best solutions below