0

次のコードは、一方のプログラムで正常に機能し、もう一方のプログラムでバスエラーを引き起こしました

    char *temp1;
    temp1=(char*)malloc(2);
    for(b=3;b>=0;b--)
       {
       sprintf(temp1,"%02x",s_ip[b]);
       string temp2(temp1); 
       temp.append(temp2);
       } 

s_ip [b]はbyte型で、tempは文字列です。このバスエラーの原因と、これを解決するにはどうすればよいですか?さらに、この奇妙な行動の理由は何ですか?

4

2 に答える 2

6

tempバッファの長さは3文字である必要があります。これsprintf()は、2つの16進文字の後にヌル文字を追加するためです。

char temp1[3];

動的に割り当てられたメモリを使用する理由はないようです。を使用すると、string名前付きの一時的な名前の作成を回避できることに注意してください。temp2std::string::append()

temp.append(temp1, 2);

別の方法は、IOマニピュレータのsprintf()使用を避けて使用することです。std::ostringstream

#include <sstream>
#include <iomanip>

std::ostringstream s;

s << std::hex << std::setfill('0');

for (b = 3; b >= 0; b--)
{
    s << std::setw(2) << static_cast<int>(s_ip[b]);
}

次に、を使用s.str()してインスタンスを取得しstd::stringます。

于 2012-09-11T10:54:51.150 に答える
3

文字列の最後にも終了があるため、2文字の文字列には実際には3バイトが必要'\0'です。

于 2012-09-11T10:55:10.743 に答える