当前位置:  开发笔记 > 编程语言 > 正文

在C++中将字符序列重复到更大缓冲区的最简单方法

如何解决《在C++中将字符序列重复到更大缓冲区的最简单方法》经验,为你挑选了2个好方法。

给定(在C++中)

char * byte_sequence;
size_t byte_sequence_length;
char * buffer;
size_t N;

假设byte_sequencebyte_sequence_length初始化为某个任意长度的字节序列(及其长度),并buffer初始化为指向N * byte_sequence_length字节,那么复制byte_sequencebuffer N时间的最简单方法是什么?STL/BOOST中有什么东西可以做这样的事吗?

例如,如果序列是"abcd",并且N是3,那么buffer最终将包含"abcdabcdabcd".



1> Eclipse..:

我可能会这样做:

for (int i=0; i < N; ++i)
    memcpy(buffer + i * byte_sequence_length, byte_sequence, byte_sequence_length);

这假设您正在处理二进制数据并且正在跟踪长度,而不是使用'\0'终止.

如果你想要这些是c字符串,你必须分配一个额外的字节并添加'\0'到最后.给定一个c字符串和一个整数,你想这样做:

char *RepeatN(char *source, size_t n)
{
    assert(n >= 0 && source != NULL);            
    size_t length = strlen(source) - 1;
    char *buffer = new char[length*n + 1];
    for (int i=0; i < n; ++i)
        memcpy(buffer + i * length, source, length);
    buffer[n * length] = '\0';
}



2> Brian R. Bon..:

在避免指针算术的同时重复缓冲:

您可以使用std :: vector 或std :: string来使您更轻松.这两个容器也可以保存二进制数据.

此解决方案具有以下良好属性:

您无需担心内存访问冲突

您无需担心缓冲区的大小是否正确

您可以随时将序列附加到缓冲区,而无需手动重新分配

.

//Note this works even for binary data.
void appendSequenceToMyBuffer(std::string &sBuffer
       , const char *byte_sequence
       , int byte_sequence_length
       , int N)
{
  for(int i = 0; i < N; ++i)
      sBuffer.append(byte_sequence, byte_sequence_length);
}

//Note: buffer == sBuffer.c_str()

备用:对于使用memcpy的二进制数据:

buffer = new char[byte_sequence_length*N];
for (int i=0; i < N; ++i)
  memcpy(buffer+i*byte_sequence_length, byte_sequence, byte_sequence_length); 
//...
delete[] buffer;

备用:对于使用strcpy的空终止字符串数据:

buffer = new char[byte_sequence_length*N+1];
int byte_sequence_length = strlen(byte_sequence);
for (int i=0; i < N; ++i)
  strcpy(buffer+i*byte_sequence_length, byte_sequence, byte_sequence_length); 
//...
delete[] buffer;

备用:如果使用单个值填充缓冲区:

buffer = new char[N];
memset(buffer, byte_value, N);
//...
delete[] buffer;

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有