首页 新闻 会员 周边

关于c++判断长度问题

0
悬赏园豆:5 [已解决问题] 解决于 2013-10-30 11:17

c++中 很多内置方法判断指针长度 都是通过0结尾来判断 

譬如一个方法

1 char* CommonMethod::AppendChar(const char* addThis, const char* toThis,int resultSize)
2 {
3     char* result = (char*)malloc(resultSize+1);
4     memset(result,0,resultSize+1);
5     strcpy( result, toThis );
6     strcat( result, addThis );
7     return result;
8 }
View Code

假若addThis在内存中16进制表现形式为:  a8 d2 2c 72 ac 00 fe cb c7 39 d7 59 cb 34 69 33 28 73 f6 fc 00


那么程序就会从第一个00 开始位置进行拼接 从而忽略掉 fe bc c7... 等后面的内容

太多太多这样的例子了 比如strlen(void*)  等等

判断长度都用 0 结尾来判断 而内容中间本身含有0的话 则截取有误 导致最终获取内容有误 

我应该怎么做呢? 是在c++避免使用指针 还是有其他好办法?

果果天涯的主页 果果天涯 | 初学一级 | 园豆:16
提问于:2013-10-29 14:47
< >
分享
最佳答案
1

你需要在传入 addThis 时,同时指定大小,也就是这样定义 AppendChar

char* CommonMethod::AppendChar(const char* addThis,int addSize,const char* toThis,int resultSize)

那么在实现内部,你就不能使用 strcpy strcat 方法,而是替换为 memcpy.

你需要理解以 0 结尾的字符串和不以 0 结尾的字符串的区别.

strlen,strcpy,strcat 这些都是使用的以 0 结尾的字符串.

收获园豆:4
Launcher | 高人七级 |园豆:45045 | 2013-10-30 09:14

谢谢 和我后面写的如此一辙

1 void CommonMethod::AppendChar(const char* addThis, const char* toThis,int sizeAdd,int sizeTo,char* result)
2 {
3     result =new char[sizeAdd+sizeTo];
4     memcpy(result, toThis, sizeTo);
5     memcpy(result+sizeTo, addThis, sizeAdd);
6     
7 }
View Code

但是我这样写还是有问题 我传一个调用方定义的result到此方法里 给result赋值  但为什么调用方拿到这个result的时候 还是NULL呢

调用方代码:

1 char* result=NULL;
2 CommonMethod method;
3 method.AppendChar(addList,(char*)instr,paddingCount,Filelength,result);
4 //下面使用result的时候 仍旧指向NULL
View Code
果果天涯 | 园豆:16 (初学一级) | 2013-10-30 09:53

@果果天涯: 你应该这样写,请区分参数传值和传引用的区别:

CommonMethod::AppendChar(const char* addThis, const char* toThis,int sizeAdd,int sizeTo,char** result)

{

    char * p = new char[sizeAdd+sizeTo];

    

     *result = p;

}

Launcher | 园豆:45045 (高人七级) | 2013-10-30 11:08

@Launcher: 谢谢您的回答

果果天涯 | 园豆:16 (初学一级) | 2013-10-30 11:17
其他回答(1)
0

1. 通过0判断的是字符串的结尾,而不是指针指向的内存大小. 

2. c++不提供判断内存大小的功能,malloc了多少,由程序员自己记录维护指针和其大小关系。

收获园豆:1
嗷嗷 | 园豆:757 (小虾三级) | 2013-10-29 16:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册