【发布时间】:2020-02-28 08:35:54
【问题描述】:
我正在尝试实现一个非常简单的strtoi 函数。当动态创建传递的参数时它工作正常(下面的案例 2)。但是,如果 char 是由在编译时分配的 char[] 创建的,我会在 len 上得到一个常量值,因为 std::strlen(ch) 会扰乱我的逻辑,我找不到解决方案。
int strtoi(char* ch)
{
int sum {0};
int len = static_cast<int>(std::strlen(ch));
int skipLast = static_cast<int>(static_cast<int>(ch[0]) == 45);
//Integer Method
for(int i = len - 1; i >= 0 + skipLast; i--)
{
if(static_cast<int>(ch[i]) < 48 || static_cast<int>(ch[i]) > 57)
return 0;
sum += (ch[i]-48) * std::pow(10,i-skipLast);
}
sum = skipLast == 1 ? -sum : sum;
return sum;
}
int main()
{
char pos[3] {'1','2','3'};
std::cout << strtoi(pos) << std::endl;
char neg[4] {'-','1','2','3'};
std::cout << strtoi(neg) << std::endl;
return 0;
}
返回:0 和 -123。我的函数中的len 变量在第一次调用时没有得到预期值,我认为这是因为neg[4] 分配了比pos[3] 更多的内存。但是,对于第二种情况:
int main()
{
char* pos;
pos = new char[3] {'1','2','3'};
std::cout << strtoi(pos) << std::endl;
char* neg;
neg = new char[4] {'-','1','2','3'};
std::cout << strtoi(neg) << std::endl;
return 0;
}
返回123、-123。预期的结果。
我猜这是因为在第一种情况下,编译器根据char[4] 数组为函数及其参数分配内存。它是否正确?
对于第二种情况,它是如何工作的,编译器如何为动态变量的函数分配内存?
使该功能适用于两种情况的可能解决方案是什么?
提前感谢您的帮助。
【问题讨论】:
-
static_cast<int>(static_cast<int>(ch[0]) == 45)是ch[0] == '-'的一种非常复杂的说法。我还建议您学习改用std::isdigit和ch[i]-'0'。并且一般停止使用magic numbers。 -
还要注意
std::pow是一个浮点函数,它带来了处理浮点值的所有问题(如舍入错误)。还有其他方法可以使用 10 个装扮者,例如通过适当地初始化一个整数变量,然后在循环的每次迭代中将其乘以或除以10。
标签: c++ c++11 compile-time-constant