字符串数组导出有关问题
字符串数组导出问题我封装了一个库,需要定义一个接口,返回字符串数组,如何定义这个接口,我大概想了下,大概
字符串数组导出问题
我封装了一个库,需要定义一个接口,返回字符串数组,如何定义这个接口,我大概想了下,大概有这样几种方法,希望大家能给些意见和建议啊
1) 专门用c++的stl库,大概如下形式
C/C++ codevoid get_var(list<string> *var_list)
这样可以再其它的工程中调用这个接口,比较方便,不过有个两个问题:
第一是我的库是纯c写的,不希望因为这个导入c++;
另外如果用stl的话,不同的工具和stl是不具备兼容性的
2) 第二种办法就是用用字符串指针,大概如下形式
C/C++ codevoid get_var(char **var_list, int *size)
第一次调用,var_list置空,返回size,即有几个字符串,由上层分配内存,第二次调用,则将字符串列表返回出去
这也问题:
第一,字符串也有长度,所以完善的做法是不仅要返回多少个字符串,还要返回每个字符串的长度
第二,会造成时间浪费,上层如果是用stl之类的存储字符串数组,则要先转换字符串指针数组到stl字符串链表转换
3)第三种办法,类似于枚举回调函数,即每次返回一个字符串,知道返回失败为止
C/C++ codevoid get_var(char *var_list, int *size)
这个size就是字符串长度了
一直调用该函数,知道失败为止,可是这个有点问题,在库里面需要记住枚举顺序,而且这个也有时间浪费
[解决办法]mark 学习~~~
我的第四种方案
C/C++ codevoid get_var(void *var_list, int *size)
[解决办法]
[解决办法]
楼主的几种方法基本上也是这些方法了,要么就自己截取字符串等来区分子字符串
[解决办法]
我记得Windows 的 API 也是这样的,字符串用\0分割,最后一个字符串以2个\0结束
[解决办法]
可以返回struct,类似于补‘\0’
typeddef struct
{
char sz1[...];
.....
}Your_stru;
[解决办法]
[解决办法]
自己处理字符串
用分隔符处理成一个串,
一起导出来
[解决办法]
自己再封装一次,用\0作分隔符,不过在从字符串数组取字符串的时候的一些方法函数就要注意了,很多函数遇到\0就直接结束了,比如strlen函数
[解决办法]
void get_var(char **str_list, int* strsize, int *size)
第一次调用获得字符串数量size,
第二次调用获得每个字符串的长度strsize,
最后获得字符串。
[解决办法]
在实际操作中一般不需要返回字符串数组,而是直接返回字符串数组的地址,这样做的好处的效率大大提高。
[解决办法]
个人觉得,用第一种方法好。库就是为了以后容易用点嘛~
[解决办法]
[解决办法]
C/C++ code//内存都在里面动态申请//nRow 表示有多少个字符创//nSize 存储每个字符串的长度char get_var(char**var_list,int nRow, int *nSize);free_var(char**var_list,int nRow,int *nSize);
------解决方案--------------------
//呵呵,都是out 的参数
char get_var(char**var_list,int &nRow, int *nSize);
[解决办法]
其实不用过于担心浪费了一点时间
[解决办法]
返回的数组大小有上限吗?
我想根据上限定夺分配的资源会好些。
[解决办法]
参考
C/C++ codeLPTCH WINAPI GetEnvironmentStrings(void);
[解决办法]
1)这个方法自然舍弃,不用想!我做的是wince系统,凡是模板的东西一定要慎用,我看linux东西也未必好到哪里去,而且这个东西效率也不敢恭维。并且从你的需求来看,即使用也应当用vector更为合适
2)脚本程序以解释执行的居多,当然也有在解释执行先做优化的,所以这种方法应当保留
3)综合你的应用这个肯定需要
所以个人认为2和3两种方法都应当保留,容易扩展,也能保证灵活性。如果只选一种,最起码3肯定是必须的
[解决办法]
外面 void get_var(char **var_list, int *size)
void release_var(char **var_list)
库里面负责内存的申请和释放,外部只是引用。
用引用计数的方法确定指针是否应该释放。
--- 这样效率是不是高点?
[解决办法]
可以参考下windows的com里面同样的需求的设计。 他的实现是 IEnumString
interface IEnumString
{
Next(...); //获取下一个;
Skip(); //忽略一个,也就是移动一个指针位。
Reset(); //指针回到最开始。
Clone(); ///.... 多余的东东
}
[解决办法]
我一直奇怪IEnumString为什么设计成这么罗嗦的形式,不过在windows里面IEnumString还是用的挺多的。
其实大可以两个函数就搞定了: int GetCount(); char× GetAt(int n);