如何将std :: string转换为int?

758

我想将一个字符串转换为整数,而不是ASCII码。

简单来说,我们会得到一个字符串方程。我们需要将其分解,正确格式化并解决线性方程。但是,我无法将字符串转换为整数。

我知道这个字符串的格式将是(-5)或(25)等,因此它一定是整数。但是如何从一个字符串中提取出它呢?

我考虑的一个方法是通过字符串运行for / while循环,检查数字,提取其后的所有数字,然后查看是否有前导'-',如果有,则将整数乘以-1。

但对于这样一个小问题来说,似乎有点过于复杂了。你们有什么好主意吗?


12
你尝试过使用atoi()函数吗? - i_am_jorf
3
好的,我会尽力进行翻译。以下是您提供链接中的内容:函数原型:int atoi (const char* str);功能:将参数 str 所指向的字符串转换为一个整数(类型为 int)。返回值:如果转换成功,则返回该整数,否则返回零。注意事项:
  • 该函数会跳过字符串开头的空格字符。
  • 当遇到非数字字符时,停止转换,返回当前已经转换的整数值。
  • 如果转换后的整数超出了 int 类型的范围,则返回 INT_MAXINT_MIN,具体取决于转换结果的符号。
示例用法:/* atoi examples */ #include /* printf */ #include /* atoi */ int main () { int i; char buffer[256]; printf ("Enter a number: "); fgets (buffer, 256, stdin); i = atoi (buffer); printf ("The value entered is %d. Its double is %d.\n",i,i*2); return 0; }
- i_am_jorf
2
http://stackoverflow.com/search?q=convert+string+int++c%2B%2B - Kiril Kirov
9
那么你建议他为一些标准库已经能够完成的事情使用整个库吗?@Chad - Bojangles
8
如果你有一个名为 myStringstd::string,而想要使用 atoi 函数,则需要输入 atoi(myString.c_str()) - Robᵩ
显示剩余7条评论
26个回答

0
long long toll(string a) {
    long long ret = 0;
    bool minus = false;
    for (auto i : a) {
        if (i == '-') {
            minus = true;
            continue;
        }
        ret *= 10;
        ret += i-'0';
    }
    if (minus)
        ret *= -1;
    return ret;
}

使用方法:

long long a = toll(string("-1234"));

0

错误处理未完成

int myatoti(string ip)
{
    int ret = 0;
    int sign = 1;
    if (ip[0] == '-')
    {
        ip.erase(0, 1);
        sign = -1;
    }
    int p = 0;
    for (auto it = ip.rbegin(); it != ip.rend(); it++)
    {
        int val = *it - 48;
        int hun = 1;
        for (int k = 0; k < p; k++)
        {
            hun *= 10;
        }
        ret += val * hun;
        p++;
        
    }


    return ret * sign;

}

-2

还有一种简单的方法:假设您有一个字符,如c='4',因此您可以执行以下步骤之一:

第一步:int q

q=(int) c; (q现在是ascii表中的52)。 q=q-48;请记住,将48添加到数字上是它们的ascii代码。

第二种方式:

q=c-'0'; 相同,字符'0'表示48


1
问题是关于从 string 转换为 int,而不是从 char 转换为 string - Yuchen
有漏洞且不符合问题。 - caoanan

-2

我认为将int转换为std::string或反之亦然需要一些特殊的函数,例如std::stoi(), 但如果您需要将double转换为string,请使用to_string()(不是C#。C#是.ToString()而不是to_string())


std::stoi 已经在许多其他答案中提到,而问题也没有询问如何将 double 转换为字符串。 - cigien
由于您的回答当前写得不够清楚,请[编辑]以添加更多细节,帮助其他人理解如何回答提出的问题。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community

-2
一行代码版本:long n = strtol(s.c_str(), NULL, base);
(其中s是字符串,base是一个整数,如2、8、10、16。)
您可以参考此链接了解更多关于strtol的详细信息。
核心思想是使用包含在cstdlib中的strtol函数。
由于strtol仅处理char数组,因此我们需要将string转换为char数组。您可以参考这个链接
一个例子:
#include <iostream>
#include <string>   // string type
#include <bitset>   // bitset type used in the output

int main(){
    s = "1111000001011010";
    long t = strtol(s.c_str(), NULL, 2); // 2 is the base which parse the string

    cout << s << endl;
    cout << t << endl;
    cout << hex << t << endl;
    cout << bitset<16> (t) << endl;

    return 0;
}

这将输出:

1111000001011010
61530
f05a
1111000001011010

-5

如果你不喜欢硬编码 :)

bool strCanBeInt(std::string string){
    for (char n : string) {
        if (n != '0' && n != '1' && n != '2' && n != '3' && n != '4' && n != '5'
            && n != '6' && n != '7' && n != '8' && n != '9') {
            return false;
        }
    }
    return true;
}

int strToInt(std::string string) {
    int integer = 0;
    int numInt;
    for (char n : string) {
        if(n == '0') numInt = 0;
        if(n == '1') numInt = 1;
        if(n == '2') numInt = 2;
        if(n == '3') numInt = 3;
        if(n == '4') numInt = 4;
        if(n == '5') numInt = 5;
        if(n == '6') numInt = 6;
        if(n == '7') numInt = 7;
        if(n == '8') numInt = 8;
        if(n == '9') numInt = 9;
        if (integer){
            integer *= 10;
        }
        integer += numInt;
    }
    return integer;
}

4
这段代码未处理溢出或负数。第二个函数与atoi非常相似,不确定为什么要手写。此外,一些东西可以改进:不要按值传递字符串,更多地使用标准函数(第一个函数可以使用类似于std::all_of + std::isdigit的内容进行重写)。 - HolyBlackCat
这段代码非常啰嗦。就像其他评论所说的那样,你可以完全消除strCanBeInt并直接使用<ctype.h>中的isdigit函数。只需要使用n-'0'代替那个冗长的if系列即可。 - user16217248

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接