c++ - 自定义 strtoi 函数编译时问题
问题描述
我正在尝试实现一个非常简单的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
要求字符串为空终止,如下所示:
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[]
推荐阅读
- swift - AnimateKeyframes 同时运行所有关键帧 (Swift)
- haskell - 如何在haskell中连续打印相同的字符
- blockchain - 如何修复 - RPC 调用期间的错误 - R3 Corda?
- java - 扫描另一个包中的存储库
- python - TypeError:需要一个类似字节的对象,而不是 'str' py 2.7 到 py 3.6
- php - 使用 php 和 mysqli 在 html 页面中消息传递如何工作?
- reactjs - 如何从 LinkedIn oAuth2 读取 accessToken
- apache-kafka - 卡夫卡代理作为中间
- forms - 如何在街道地址字段的magento 2结帐上添加工具提示?
- linux-kernel - 在 Linux 内核中获取帧计数