我是C ++的初学者,我想要一种简单的方法将char字符串(char * str1)转换为整数。 我可以使用atoi做到这一点,但是我已经读到该功能是“恶魔”,不应该使用。 由于多种原因,我不想使用C ++ std:string,因此我的字符串必须为char *格式。你有什么建议吗?
预先感谢
答案 0 :(得分:2)
或者,仍然使用C风格,使用sscanf
:
/* sscanf example */
#include <stdio.h>
int main ()
{
char sentence []="Rudolph is 12 years old";
char str [20];
int i;
sscanf (sentence,"%s %*s %d",str,&i);
printf ("%s -> %d\n",str,i);
return 0;
}
[ EDIT ] 如 @Killzone Kid 在评论中所述,其中有一个std version。
#include <iostream>
#include <clocale>
#include <cstdio>
int main()
{
int i, j;
float x, y;
char str1[10], str2[4];
wchar_t warr[2];
std::setlocale(LC_ALL, "en_US.utf8");
char input[] = u8"25 54.32E-1 Thompson 56789 0123 56ß水";
// parse as follows:
// %d: an integer
// %f: a floating-point value
// %9s: a string of at most 9 non-whitespace characters
// %2d: two-digit integer (digits 5 and 6)
// %f: a floating-point value (digits 7, 8, 9)
// %*d an integer which isn't stored anywhere
// ' ': all consecutive whitespace
// %3[0-9]: a string of at most 3 digits (digits 5 and 6)
// %2lc: two wide characters, using multibyte to wide conversion
int ret = std::sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc",
&i, &x, str1, &j, &y, str2, warr);
std::cout << "Converted " << ret << " fields:\n"
<< "i = " << i << "\nx = " << x << '\n'
<< "str1 = " << str1 << "\nj = " << j << '\n'
<< "y = " << y << "\nstr2 = " << str2 << '\n'
<< std::hex << "warr[0] = U+" << warr[0]
<< " warr[1] = U+" << warr[1] << '\n';
}
答案 1 :(得分:1)
您应该使用C ++ stoi(https://en.cppreference.com/w/cpp/string/basic_string/stol):
int main()
{
std::cout << std::stoi("123");
}
当然,您应该传递一个pos
参数,以查看字符串是否已完全转换。
答案 2 :(得分:0)
C ++样式,但没有字符串:
#include <iostream>
#include <sstream>
int str2i(const char *str)
{
std::stringstream ss;
ss << str;
int i;
ss >> i;
return i;
}
int main()
{
std::cout << str2i("123");
}
答案 3 :(得分:0)
您需要考虑atoi被认为不安全的原因。无法知道转换是否有效。
类似的C函数函数是strol。要使用它,请执行以下操作:
char* input_string = ...
char* end = nullptr;
long value = strol(input_string, &end, 10);
if (input_string == end) {
// converison failed
}
或者,如果您正在编程C ++而不是C,则可以使用我的通用读取功能之一:
template <typename T>
T from_string(const std::string_view str)
{
std::stringstream buff(str);
T value;
buff >> value;
// check if all input was consumed
if (buff.gcount() != str.size())
{
throw std::runtime_exception("Failed to parse string.");
}
return value;
}
然后可以将其用于运算符中具有流的任何对象。就您而言:
const char* int_string = "1337";
int int_value = from_string<int>(int_string );