lua与c++交互篇:char* 中的陷阱,万恶的'/0'结尾

来源:互联网 发布:成套报价软件 编辑:程序博客网 时间:2024/04/30 00:48

char* 中的陷阱,万恶的'/0'结尾

今天工作中犯了个很‘2’的错误我用char*申请了一个定长数组然后将其填充满

c++与lua交互的时候lua总报字符串长度不符


#define MAX_GUILD_NAME_LENGH 12
char mGuidName[MAX_GUILD_NAME_LENGH];
sprintf_s(mGuildName ,MAX_GUILD_NAME_LENGH ,"好大的帮会啊");

state.PushString(mGuidName);

当时没考虑太多东西,因为谁都了解String是比较安全的,

结果lua截获的字符串是“好大的帮会啊<ERROR>"

如果当时脑袋没乱的话,一下子就能想到这个error是个常识性错误

char数据是可以填充满的,然而如果char*给填充满的话,就没有'\0'结尾了,然而当执行到

state->PushString(mGuidName);的时候是将char*作为字符串传出,而传出的一个没有结束符号的字符串

如此lua当然不直到接收到什么程度才算完。

解决的办法是讲申请接受服务端数据的地方增加一个字节

char mGuidName[MAX_GUILD_NAME_LENGH + 1];

填充完数据之后无论如何都给尾部增加一句

sprintf_s(mGuildName ,MAX_GUILD_NAME_LENGH ,"好大的帮会啊");

mGuidName[MAX_GUILD_NAME_LENGH]  =  '\0';

如此做省去了if的判断,如果长度不足以填满,则char*中必然有个'\0'结尾,在压入字符串的时候state遇到'\0'之后就默认为字符串已经结束了,同时也就不用考虑尾部那个结束符号做什么用了。

此时我再调用

state->PushString(mGuidName);

时候lua就能够正确打印出名称了

 

 

原创粉丝点击