我已经创建了这些简单的功能。
char* tmp = new char[len];
strncpy(tmp,str+start,len);
int ret = atoi(tmp);
delete []tmp;
return ret;
我遇到内存管理问题。 当我读取ret变量时,该值为null。如果我删除指令“delete [] tmp;”值是正确的,但内存快速增加(因为我没有释放内存)。
有什么想法吗? 感谢
答案 0 :(得分:1)
来自man strncpy:strncpy()函数与strcpy类似,只是复制了src的最多n个字节。警告:如果src的前n个字节中没有空字节,则放在dest中的字符串将不会以空值终止。
检查str
变量长度并验证此空格终止strncpy
答案 1 :(得分:1)
atoi
存在一些问题,其中之一是它没有任何验证,你传递的字符串实际上是一个数字。相反,您可能希望改为使用strtol
。
另请注意,strncpy
在某些情况下可能不会终止字符串。并且您可能希望为终结符分配一个额外的字符(len + 1
)。
答案 2 :(得分:1)
strncpy
一旦到达源的末尾,就用'\ 0'填充目标数组。
atoi
期望空终止的c-string,表示以'\ 0'结尾的字符数组。
因此,您必须创建一个大小为len + 1
的数组,strncpy
函数将自动空终止您的目标数组。
答案 3 :(得分:0)
您可以做的是从函数外部分配缓冲区,并将tmp参数作为数组传递。但更好的方法是分配一个对象。只要您不使用new关键字,这些就会被破坏。 std::string
在这种情况下会很完美。
答案 4 :(得分:0)
确保使用tmp
'\0'
答案 5 :(得分:0)
很难说出自str
和len
未显示以来出现了什么问题。
这个功能可以简单得多:
int ret = atoi(str + start);
return ret;
BTW,ret
是int
,NULL通常被称为指针。