我正在尝试实现一个非常简单的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]
数组为函数及其参数分配了内存。它是否正确?在第二种情况下它是如何工作的,编译器如何为动态变量的函数分配内存?
使函数在两种情况下都可以工作的解决方案是什么?
在此先感谢您的帮助。
最佳答案
strlen
要求字符串以null终止,如下所示:
char* pos = new char[4] {'1','2','3','\0'};
std::cout << strlen(pos) << "\n"; // Shows "3"
添加此空终止符有一个捷径:
const char[] pos = "123";
std::cout << strlen(pos) << "\n"; // Shows "3"
std::cout << sizeof(pot) << "\n"; // Shows "4"
我使用pos的数组类型只是为了说明它实际上是4个字符。您可以改用
const char*
(实际上是典型的),但是sizeof
行不起作用。请注意,如果您分配这样的字符串文字,那么以后就不能在其上使用
delete
,而如果您对数组使用delete
或new
,则可以(并且应该)使用delete[]
。
关于c++ - 自定义strtoi函数编译时间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60447950/