C++ 在字符串附加函数中,空终止无符号字符缓冲区的有效方法?

C++ 在字符串附加函数中,空终止无符号字符缓冲区的有效方法?,c++,c,buffer,bytearray,null-terminated,C++,C,Buffer,Bytearray,Null Terminated,我一直在写一个“字节缓冲区”实用程序模块——只是一组供个人在低级开发中使用的函数 不幸的是,当myByteBuffer\u Append(…)函数以null结尾终止字符和/或为null结尾字符添加额外空间时,该函数无法正常工作。尝试此操作时的一个结果是,我对缓冲区的数据调用printf()(执行对(char*)的转换):我将只获得字符串的一部分,因为将找到缓冲区中的第一个空终止字符 所以,我想要的是一种在函数中加入某种空终止功能的方法,但我在这方面有点空白,这是一种很好的方法,并且可以在正确的方

我一直在写一个“字节缓冲区”实用程序模块——只是一组供个人在低级开发中使用的函数

不幸的是,当my
ByteBuffer\u Append(…)
函数以null结尾终止字符和/或为null结尾字符添加额外空间时,该函数无法正常工作。尝试此操作时的一个结果是,我对缓冲区的数据调用
printf()
(执行对
(char*)
的转换):我将只获得字符串的一部分,因为将找到缓冲区中的第一个空终止字符

所以,我想要的是一种在函数中加入某种空终止功能的方法,但我在这方面有点空白,这是一种很好的方法,并且可以在正确的方向上使用一个点

下面是代码,如果有帮助的话:

void ByteBuffer_Append( ByteBuffer_t* destBuffer, uInt8* source, uInt32 sourceLength )
{
    if ( !destBuffer )
    {
        puts( "[ByteBuffer_Append]: param 'destBuffer' received is NULL, bailing out...\n" );

        return;
    }

    if ( !source )
    {
        puts( "[ByteBuffer_Append]: param 'source' received is NULL, bailing out...\n" );

        return;
    }

    size_t byteLength = sizeof( uInt8 ) * sourceLength;

    // check to see if we need to reallocate the buffer

    if ( destBuffer->capacity < byteLength || destBuffer->length >= sourceLength )
    {
        destBuffer->capacity += byteLength;

        uInt8* newBuf = ( uInt8* ) realloc( destBuffer->data, destBuffer->capacity );

        if ( !newBuf )
        {
            Mem_BadAlloc( "ByteBuffer_Append - realloc" );
        }

        destBuffer->data = newBuf;
    }

    uInt32 end = destBuffer->length + sourceLength;

    // use a separate pointer for the source data as
    // we copy it into the destination buffer

    uInt8* pSource = source;

    for ( uInt32 iBuffer = destBuffer->length; iBuffer < end; ++iBuffer )
    {
        destBuffer->data[ iBuffer ] = *pSource;

        ++pSource;
    }

    // the commented code below
    // is where the null termination
    // was happening

    destBuffer->length += sourceLength; // + 1;

    //destBuffer->data[ destBuffer->length - 1 ] = '\0';
}
void ByteBuffer\u Append(ByteBuffer\u t*destBuffer,uInt8*source,uInt32 sourceLength)
{
如果(!destBuffer)
{
puts(“[ByteBuffer\u Append]:收到的参数'destBuffer'为空,正在退出…\n”);
返回;
}
如果(!源)
{
puts(“[ByteBuffer\u Append]:接收到的参数'source'为空,正在退出…\n”);
返回;
}
size_t ByTeleLength=sizeof(uInt8)*源长度;
//检查是否需要重新分配缓冲区
if(destBuffer->capacitylength>=sourceLength)
{
destBuffer->capacity+=ByTeleLength;
uInt8*newBuf=(uInt8*)realloc(destBuffer->data,destBuffer->capacity);
如果(!newBuf)
{
Mem_BadAlloc(“ByteBuffer_Append-realloc”);
}
destBuffer->data=newBuf;
}
uInt32 end=destBuffer->length+sourceLength;
//对源数据使用单独的指针作为
//我们将其复制到目标缓冲区中
uInt8*pSource=源;
对于(uInt32 iBuffer=destBuffer->length;iBufferdata[iBuffer]=*pSource;
++pSource;
}
//下面是注释代码
//零终止在哪里
//发生了什么
destBuffer->length+=sourceLength;//+1;
//destBuffer->data[destBuffer->length-1]='\0';
}

非常感谢提供此信息的任何人。

在C/C++中,以
'\0'
结尾的
字符列表是一个字符串。有一组字符串函数,例如
strcpy()
strcmp()
,它们将
char*
作为参数,当它们找到一个
'\0'
时,字符串结束于此。在您的例子中,
printf(“%s”,buf)
将buf视为字符串,因此当它找到一个
“\0”
时,它停止打印


如果正在执行缓冲区,则意味着任何包含
'\0'
的数据都是缓冲区中的正常数据。所以你应该避免使用字符串函数。要打印缓冲区,您需要实现自己的功能。

在C/C++中,以
'\0'
结尾的
字符列表是一个字符串。有一组字符串函数,例如
strcpy()
strcmp()
,它们将
char*
作为参数,当它们找到一个
'\0'
时,字符串结束于此。在您的例子中,
printf(“%s”,buf)
将buf视为字符串,因此当它找到一个
“\0”
时,它停止打印


如果正在执行缓冲区,则意味着任何包含
'\0'
的数据都是缓冲区中的正常数据。所以你应该避免使用字符串函数。要打印缓冲区,您需要实现自己的功能。

看起来您的问题是由内存损坏引起的

您必须解决以下三个问题:

1检查分配的空间是否足够

if ( destBuffer->capacity < byteLength || destBuffer->length >= sourceLength )
最好是成为

destBuffer->capacity = destBuffer->length + byteLength + 1;
3正确的空终止

destBuffer->data[ destBuffer->length - 1 ] = '\0';
应该成为

destBuffer->data[ destBuffer->length ] = '\0';

看起来您的问题是由内存损坏引起的

您必须解决以下三个问题:

1检查分配的空间是否足够

if ( destBuffer->capacity < byteLength || destBuffer->length >= sourceLength )
最好是成为

destBuffer->capacity = destBuffer->length + byteLength + 1;
3正确的空终止

destBuffer->data[ destBuffer->length - 1 ] = '\0';
应该成为

destBuffer->data[ destBuffer->length ] = '\0';

因此,您的注释掉的代码没有在正确的位置添加空终止符,或者?该行有什么问题?此检查不正常:
如果(destBuffer->capacitylength>=sourceLength)
;应该是length+bytellength>=capacity您不能有字节缓冲区和空终止,除非您的缓冲区不应该包含任何零。当空终止
n
p
指向的字节时,代码应该是
p[n]=0
;另外,您没有计算reallock中的0终止字节,因此您注释掉的代码没有在正确的位置添加空终止符,或者?该行有什么问题?此检查不正常:
如果(destBuffer->capacitylength>=sourceLength)
;应该是length+bytellength>=capacity您不能有字节缓冲区和空终止,除非您的缓冲区不应该包含任何零。当空终止
n
p
指向的字节时,代码应该是
p[n]=0
;此外,您也不计算reallock中的0终止字节。谢谢,这真的很有帮助。太棒了。谢谢,这真的很有帮助。那么,你会建议我用我自己的某种定界符吗?那么,你会建议我用我自己的某种定界符吗?