0

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

2 回答 2

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
}
于 2012-08-01T05:33:56.727 回答
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

于 2012-08-01T05:27:53.483 回答