2016-11-05 121 views
0

我试图从缓冲区生成一个std :: string,但我有一个奇怪的问题。 似乎这种两件式的代码是不同的:GCC 4.9 std :: string const char *

std::string myfun() 
{ 
    .... 
    std::string rv{}; 
    if (....) 
    { 
     char ibuff[256]; 
     memcpy(ibuff, m_buffer + off - 28, len); 
     ibuff[len] = 0; 
     rv.assign(ibuff); 
    } 
    ... 
    return rv; 
} 

std::string myfun() 
{ 
    .... 
    std::string rv{}; 
    if (....) 
    { 
     rv.assign(m_buffer + off - 28, len); 
    } 
    ... 
    return rv; 
} 

我可以看到在第二情况下的额外的(不可打印)字符。

+0

什么是'm_buffer'?什么是“关”?什么是'len'?他们的价值观和内容是什么?你怎么知道字符串中有一个“额外”字符?请创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们显示。 –

+0

@dude:我试着编写一个简单的例子 –

+1

@nos:肯定是不是以null结尾。但从我知道这是不是一个问题,当你在std :: string中复制一个缓冲区 –

回答

0

问题出在通常的代码的其他部分! Infact此代码按预期工作。

#include <iostream> 

int main() 
{ 
    char buff[512]; 
    std::string rv{}; 

    for (size_t i = 0; i < 512; i++) 
     buff[i] = i & 0xef; 


    buff[179] = 'X'; 
    buff[180] = 'Y'; 
    buff[181] = 'Z'; 
    buff[182] = '.'; 

    uint16_t off = 179; 
    uint16_t len = 4; 

    rv.assign(buff + off, len); 
    std::cout << "[[[" << rv << "]]]\n"; 
} 
相关问题