如何从字符串中复制每16个字节的数据?

时间:2012-08-01 05:16:32

标签: c++ string copy

我必须将数据复制到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
}

2 个答案:

答案 0 :(得分:3)

在您的代码中,不添加字符串终结符。您还可以在副本之间跳过一个字符(因为max_len17,而您只复制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
}

llvm::StringRef