Beginner needing help, converting string to integer.
Converting char/string to int?
c++ - How can I convert a std::string to int? - Stack Overflow
How can I convert an int to a string in C? - Stack Overflow
Why do we need to convert string to int in C?
What is the easiest way to convert string to int in C?
How does manual string to int conversion work in C?
Hello, I'm a first year CS student and am learning c++ at my university. I need to build a function that inputs a string from the user, "1234" for example, and then return the integer 1234.
I am not allowed to use the stoi function, and <iostream> and <string> are the only allowed libraries. I'm at a wall, I would appreciate any help! Thanks.
Hey all. I am trying to convert strings/chars to ints for a number guessing game. I have created this simple program that is supposed to start out with two character arrays and then convert them into an int, then add the two. It doesn't seem to be working. I get no output. Now I am pretty new to C. I am used to JavaScript where you can just sling data types anywhere you want, so this concept in C is giving me some trouble. Any help would be great! Thanks!
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
char string1[5] = "1234";
char string2[5] = "1000";
printf("String one says: %s \n", string1);
printf("String two says: %s \n \n", string2);
int toInt1 = string1;
int toInt2 = string2;
int add_ints = toInt1 + toInt2;
printf("String one should now be an int: %s \n", toInt1);
printf("String two should now be an int: %s \n", toInt2);
printf("So adding them together should produce: %s", add_ints);
}
In C++11 there are some nice new convert functions from std::string to a number type.
So instead of
Use with AIatoi( str.c_str() )
you can use
Use with AIstd::stoi( str )
where str is your number as std::string.
There are version for all flavours of numbers:
long stol(string), float stof(string), double stod(string),...
see http://en.cppreference.com/w/cpp/string/basic_string/stol
The possible options are described below:
1. sscanf()
Use with AI #include <cstdio>
#include <string>
int i;
float f;
double d;
std::string str;
// string -> integer
if(sscanf(str.c_str(), "%d", &i) != 1)
// error management
// string -> float
if(sscanf(str.c_str(), "%f", &f) != 1)
// error management
// string -> double
if(sscanf(str.c_str(), "%lf", &d) != 1)
// error management
This is an error (also shown by cppcheck) because "scanf without field width limits can crash with huge input data on some versions of libc" (see here, and here).
2. std::sto*()
Use with AI #include <iostream>
#include <string>
int i;
float f;
double d;
std::string str;
try {
// string -> integer
int i = std::stoi(str);
// string -> float
float f = std::stof(str);
// string -> double
double d = std::stod(str);
} catch (...) {
// error management
}
This solution is short and elegant, but it is available only on C++11 compliant compilers.
3. sstreams
Use with AI #include <string>
#include <sstream>
int i;
float f;
double d;
std::string str;
// string -> integer
std::istringstream ( str ) >> i;
// string -> float
std::istringstream ( str ) >> f;
// string -> double
std::istringstream ( str ) >> d;
// error management ??
However, with this solution is hard to distinguish between bad input (see here).
4. Boost's lexical_cast
Use with AI #include <boost/lexical_cast.hpp>
#include <string>
std::string str;
try {
int i = boost::lexical_cast<int>( str.c_str());
float f = boost::lexical_cast<int>( str.c_str());
double d = boost::lexical_cast<int>( str.c_str());
} catch( boost::bad_lexical_cast const& ) {
// Error management
}
However, this is just a wrapper of sstream, and the documentation suggests to use sstream for better error management (see here).
5. strto*()
This solution is very long, due to error management, and it is described here. Since no function returns a plain int, a conversion is needed in case of integer (see here for how this conversion can be achieved).
6. Qt
Use with AI #include <QString>
#include <string>
bool ok;
std::string;
int i = QString::fromStdString(str).toInt(&ok);
if (!ok)
// Error management
float f = QString::fromStdString(str).toFloat(&ok);
if (!ok)
// Error management
double d = QString::fromStdString(str).toDouble(&ok);
if (!ok)
// Error management
Conclusions
Summing up, the best solution is C++11 std::stoi() or, as a second option, the use of Qt libraries. All other solutions are discouraged or buggy.
You can use sprintf to do it, or maybe snprintf if you have it:
char str[ENOUGH];
sprintf(str, "%d", 42);
Where the number of characters (plus terminating char) in the str can be calculated using:
(int)((ceil(log10(num))+1)*sizeof(char))
As pointed out in a comment, itoa() is not a standard, so better use the sprintf() approach suggested in the rival answer!
You can use the itoa() function to convert your integer value to a string.
Here is an example:
int num = 321;
char snum[5];
// Convert 123 to string [buf]
itoa(num, snum, 10);
// Print our string
printf("%s\n", snum);
If you want to output your structure into a file there isn't any need to convert any value beforehand. You can just use the printf format specification to indicate how to output your values and use any of the operators from printf family to output your data.