C中有如下一段程序:
memmove(pdata, bcp_msg->MsgBody.BCP_DATA_IND_T.pData, bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength);
memmove(pdata+bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength, "\0", 1);
其中pdata为一指针,bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength返回一个整数。
如果用Delphi实现,
是不是应该先在pdata-1处存入bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength设置字符串长度,然后在pdata处拷贝bcp_msg->MsgBody.BCP_DATA_IND_T.pData?
还是在pdata处拷贝bcp_msg->MsgBody.BCP_DATA_IND_T.pData后再往pdata+bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength写入字符串结束符?
请高手指教。

解决方案 »

  1.   

    memmove(pdata, bcp_msg->MsgBody.BCP_DATA_IND_T.pData, bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength); 
    从pdata开始, 复制bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength个字节的数据到 bcp_msg->MsgBody.BCP_DATA_IND_T.pData。memmove(pdata+bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength, "\0", 1); 
    在pdata往后bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength字节处, 写入一个字节的内容,内容为0。
      

  2.   

    换成Delphi的写法(由于不知道楼主的代码中pdata是如何申明的,所以下面的例子中用了强制类型转换):Move(PByte(pdata)^, pByte(bcp_msg.MsgBody.BCP_DATA_IND_T.pData)^, bcp_msg.MsgBody.BCP_DATA_IND_T.uiLength);PByte(LongWord(pdata) + bcp_msg.MsgBody.BCP_DATA_IND_T.uiLength)^ := 0;
      

  3.   

    To jadeluo:
    我记得"\0"在C中表示字符串结束符……
      

  4.   

    看不懂你的问题,写个长度是为了干嘛?pdata你打算用什么类型?
    话说回来,这段c程序也够差的了,可能现在的c编译器已经聪明到那1byte不用再调用一次函数了吧,delphi可做不到*(pdata+bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength)=0; /* 在c里不用区分0和'\0' */如果能保证bcp_msg->MsgBody.BCP_DATA_IND_T.pData是个以'\0'结尾的字符串的话,传长度的时候直接+1,或者直接用strncpy而不是memmove
      

  5.   

    补充一下吧,pdata的定义为:char* pdata。
      

  6.   

    之前在论坛中看到说,C中以是否为结束符"\0"来判断字符串是否结束,而在Delphi中习惯于用判断长度字符串来代替。
    String的0位置是不可访问的,但小弟不知道在写入时这一位是不是要自己给出值?
      

  7.   

    你几乎全记错了
    1. 在c里,'\0'"\0"是有区别的,"\0"从不是c中“字符串”的结尾;另外,在c中'\0'和0是没区别的
    2. 早期pascal的string(相当于现在delphi里的ShortString)的确不会加一个#0,但long string(AnsiString/WideString以及d2009的UnicodeString)为了方便向winapi传递参数,也会在long string的末尾加上一个#0,但不计入string长度,而且这个字符的位置完全可以正常访问
      

  8.   

    To Seamour:
    谢谢你的指点,我有点明白了。
    但是如你所说,"\0"是一个有两个字符{'\0', '\0'}的常量数组,我还不太明白,能再解释一下。在Delphi中对应什么呢?
      

  9.   

    关键是没必要,那段c程序的第二句完全是脱裤子放屁,在c里本来就不该用memmove进行字符串的复制,何况结尾的'\0'只要写就可以了,调用一个函数的开销比单句赋值大太多了