I’m working on a C++ program where I need to convert a string containing a numeric value into an integer. I want to ensure that this conversion is handled correctly and safely, especially when dealing with potential exceptions or invalid input.
Here’s a simplified example of what I’m trying to do:
#include <iostream>
#include <string>
int main() {
std::string str = "12345"; // This could be any numeric string.
// How can I safely convert the string 'str' to an integer?
int num = ???; // The converted integer should be stored here.
std::cout << "Converted integer: " << num << std::endl;
return 0;
}
In this code, I have a string str containing a numeric value. I want to convert this string into an integer variable num . However, I want to handle potential issues gracefully, such as cases where the string is not a valid integer. Could you offer a C++ code sample illustrating the proper and secure approach to convert a string to an integer while managing any potential exceptions or errors? I appreciate you helping me. I attempted to visit multiple sites like Scaler to locate the answer, but I was unable to do so. Thank you.
I’m not a senior C++ developer, so I have no idea about the best way, but this should work:
#include <iostream>
#include <string>
#include <cctype>
int main() {
std::string str = "123";
// str[0] - gets the first character
// isdigit(character) - checks if character is a digit
// stoi throws invalid_argument exception
// if string does not start with a digit
if (isdigit(str[0])) {
/*
stoi means "String TO Integer"
you can easily change it to for example:
* stof ("String TO Float"),
* stol ("String TO Long")
* and so on …
*/
int num = std::stoi(str);
std::cout << "[DONE] Converted integer: " << num << std::endl;
} else {
std::cout << "[ERROR] Invalid input string: " << str << std::endl;
}
return 0;
}
For me looks good. I have tested it on my MX Linux distribution.
It’s interesting how much the code says about it’s author. In my case 7 years in Elixir gives result …
Even if somehow I remember somewhat about try/catch I was still looking for a “better” solution, so I have added one extra dependency for a single isdigit call.
std:err of course! When I saw your code I have reminded it immediately.
stdexcept is interesting. Maybe I have used it, but I don’t remember it much especially e.what() call. I guess that I haven’t used multiple catch blocks before in C++.
out_of_range error handling is simple, but also brilliant idea. I’m not surprised that I wasn’t thinking about such edge case since in Elixir we have just Integer for all well … integers (no small or big ones).
I only wonder why you define num variable outside of try block having in mind it’s only usage is within it, but that’s definitely not the most important thing.
So much to learn in such a small code, thanks!
Adding additional links below to the documentation pages: