如何处理分配的字符串输入?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理分配的字符串输入?相关的知识,希望对你有一定的参考价值。
我正在编写一个函数,当我在第二个参数中发现问题时,它会连接字符串。这是我的功能的简化版本
struct c_class* _Append_s(void* self, const char* str,const DWord length) // DWord is unsigned int
{
struct c_class* this = self;
this->inStr = realloc(this->inStr, length + this->len);
#pragma warning(disable:4996)
strcpy(this->inStr + this->len, str); // MSVC does an annoying warnings C4996
#pragma warning(default:4996)
this->len += length;
return this;
}
这个函数将struct c_class*
作为输入参数(void* self
),一个string
来追加,它的length
以字节为单位并返回结构指针(它是为了进行连续调用)struct c_class本身包含一个char * inStr和string的长度。但事实并非如此。
作为输入_Append_s可以采用常规const stringschar* in = "some text"
,char数组 - char in[10]
,但也有一个分配的字符串char* inm = malloc(n)
。
所以问题是:
1)我可以以某种方式跟踪分配的字符串并在连接时释放它们吗?更好的是没有额外的输入,因为它是一个内部函数,我从类型int和char *的包装器中调用它。
2)也许有一种方法可以将分配的字符串转换为const字符串表达式和之后的空闲内存?
如果第二件事是可能的,那么第一个问题就会变得过时,因为它解决了我需要产生一个完成的字符串并释放内存的问题,struct c_class*
占据了
如果你想释放char数组,你只需要在free((char*)str);
上面添加return this;
但是也许我没理解你。
正如John Humphreys-w00te在这个答案https://stackoverflow.com/a/12204279/6911200指出的那样警告C4996意味着:
函数strcpy被认为是不安全的,因为没有边界检查并且可能导致缓冲区溢出。
因此,正如它在错误描述中所暗示的那样,您可以使用
strcpy_s
而不是strcpy
:strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
以上是关于如何处理分配的字符串输入?的主要内容,如果未能解决你的问题,请参考以下文章