我必须将数据复制到16个字节的集合中。我怎么用简单的方法做到这一点? 我已经提出了下面的算法,但我怎么知道是否添加了空终止符?谢谢! :)
std::string input
//get message to send to client
std::cout << "Enter message to send (type /q to quit) : ";
getline(std::cin, input);
input += '\n';
const char *data = input.c_str();
len = strlen(data)+1;
int max_len =17;
//split msg into 16 bytes
for(int i = 0; i < len ; i+=max_len)
{
char tempStr[max_len];
//get next 16 bytes of msg and store
for(int j = 0; j < max_len ; j++)
{
tempStr[j] = data[j+i];
}//end of for loop
//Do some stuff to tempStr
}
答案 0 :(得分:3)
在您的代码中,不添加字符串终结符。您还可以在副本之间跳过一个字符(因为max_len
为17
,而您只复制16
个字符。)
我建议使用标准库的解决方案:
std::string::const_iterator pos = input.begin();
while (pos < input.end())
{
// Create a temporary string containing 17 "null" characters
char tmp[17] = {'\0' };
// Make sure we co no copy beyond the end
std::string::const_iterator end =
(pos + 16 < input.end() ? pos + 16 : input.end());
// Do the actual copying
std::copy(pos, end, tmp);
// Advance position
pos += 16;
// Use the string in 'tmp', it is properly terminated
}
答案 1 :(得分:1)
const char* data = input.c_str();
int len = input.size(); // don't add 1
for (int i=0; i<len; i+=16)
{
char tempStr[17];
tempStr[16] = 0;
strncpy(tempStr, data + i, 16);
// Do some stuff to tempStr
}
根据您对tempStr的实际操作,可能会有一个根本不涉及复制的解决方案。
for (int i=0; i<len; i+=16)
{
llvm::StringRef sref(data + i, data + std::min(i+16,len));
// use sref
}