当我不使用标准字符串时,如何在 C++ 中将字符串转换为 int?

Posted

技术标签:

【中文标题】当我不使用标准字符串时,如何在 C++ 中将字符串转换为 int?【英文标题】:How can I convert a string to an int in c++ when I'm not using a standard string? 【发布时间】:2013-11-01 13:25:07 【问题描述】:

我正在构建自己的字符串类,并尝试使用此函数将数字字符串转换为整数:

int String::convertToInt() const   
    int exp = length() - 1;
    int result = 0;

    for(int i = 0; i < length(); ++i) 
        result += (charAt(i) - '0') * (10 ^ exp);
        --exp;
       
    return result;

有些东西工作不正常,但我无法确定它是什么。当我尝试将“49”转换为 int 时,它会将其转换为 134。

【问题讨论】:

How does atoi() function in C++ work? 的可能重复项 你看过'atoi'还是'strtol'/'strtoul'? 【参考方案1】:

^ 是异或。我相信您正在寻找std::pow(10, exp)

甚至这个:

int String::convertToInt() const   
    int order = std::pow(10, length() - 1);
    int result = 0;

    for(int i = 0; i < length(); ++i) 
        result += (charAt(i) - '0') * order;
        order /= 10;
       
    return result;

【讨论】:

@MSalters 现在好点了吗?正如你评论的那样,我正在输入编辑。当然,这里的规范方法是霍纳(+1 你的答案),但我试图坚持接近 OP 的代码。 问题是std::pow 不是很快,它使用浮点数学。同样,整数除法也没有那么快。你最好从i=length()-1order=1开始,然后是order *= 10--i【参考方案2】:

最简单的方法是认识到494 * 10 + 9,而493 同样是49 * 10 + 3

也就是说,结果是前N-1个数字加上最后一个数字的10倍。您可以将其编写为循环或递归函数。堆栈深度不会伤害您;大约 20 位数字后,您甚至会溢出 64 位结果。所以

int String::convertToInt() const 
    if (empty()) return 0; // Recursive functions better terminate.
    // TODO: negative numbers.  
    return 10 * convertToInt(substr(0, length()-1)) + (back() - '0');

int String::convertToInt() const 
    // TODO: negative numbers.  
    int result = 0;

    for(int i = 0; i < length(); ++i) 
        result * = 10;
        result += (charAt(i) - '0');
       
    return result;

【讨论】:

您的意思是...... 493 是(((4 * 10) + 9) * 10) + 3(一次一位) @Dave:这也是真的。它只是在一个表达式中显示了前两个步骤。【参考方案3】:

更有效的方法是:

// I know you said you are using something else
// but the same principle applies here
std::string s = "12345";

unsigned int result = 0;
unsigned int place = 1;
for (std::size_t i = s.length() - 1; i >= 0; --i, place *= 10)

    result += (s[i] - '0') * place;

基本上,你从最右边的角色开始,然后向左工作。您向左移动的每个字符,您将您的place 乘以 10(非常类似于我们大多数人在成长过程中学习加法的方式:添加您的 1……添加您的 10 的……添加您的 100 的……等等) .这也假设您已经知道字符串只包含数字字符('0'-'9')。

【讨论】:

以上是关于当我不使用标准字符串时,如何在 C++ 中将字符串转换为 int?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 stringstream 在 C++ 中将字符串转换为双精度值 [关闭]

如何在 C++ 中将文件中的段落作为单个字符串读取

c++ 中将标准输入内容读入字符串或向量的最快方法

如何在 C++ 中将字符串转换为字符? [复制]

如何在 C++ 中将整个文件读入 std::string?

如何使用 C++ 在 Winsock 中将大字符串从客户端发送到服务器