给定(在C++中)
char * byte_sequence; size_t byte_sequence_length; char * buffer; size_t N;
假设byte_sequence
并byte_sequence_length
初始化为某个任意长度的字节序列(及其长度),并buffer
初始化为指向N * byte_sequence_length
字节,那么复制byte_sequence
到buffer
N
时间的最简单方法是什么?STL/BOOST中有什么东西可以做这样的事吗?
例如,如果序列是"abcd",并且N
是3,那么buffer
最终将包含"abcdabcdabcd".
我可能会这样做:
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'; }
在避免指针算术的同时重复缓冲:
您可以使用std :: vector
此解决方案具有以下良好属性:
您无需担心内存访问冲突
您无需担心缓冲区的大小是否正确
您可以随时将序列附加到缓冲区,而无需手动重新分配
.
//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;