将char *字符串转换为int而不使用atoi

时间:2018-11-19 09:14:20

标签: c++ string char atoi

我是C ++的初学者,我想要一种简单的方法将char字符串(char * str1)转换为整数。 我可以使用atoi做到这一点,但是我已经读到该功能是“恶魔”,不应该使用。 由于多种原因,我不想使用C ++ std:string,因此我的字符串必须为char *格式。你有什么建议吗?

预先感谢

4 个答案:

答案 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 );