最近在看darknet源码,发现其中有很多很实用的函数,而这些函数在python中直接当做是封装好的函数供我们使用,能够了解这些函数低层源码,我觉得不但能够提高自己对darknet网络的理解,并且还能够加强对python函数的理解,够提高自己的编程能力。
1 strip_args()函数
strip()函数能够删除一个字符串中所包含的空格、制表符和换行符,这正好也对应python中的strip()函数(python中的strip()函数只能够函数开头或者结尾的空格,不能够删除中间的空格)
void strip_args(char *s)
{
size_t i;
size_t len = strlen(s);
size_t offset = 0;
for(i = 0; i < len; ++i){
char c = s[i];
// offset为要剔除的字符数,比如offset=2,说明到此时需要剔除2个空白符,
// 剔除完两个空白符之后,后面的要往前补上,不能留空
if(c==' '||c=='\t'||c=='\n') ++offset;
else s[i-offset] = c; // 往前补上
}
// 依然在真正有效的字符数组最后紧跟一个terminating null-characteristic '\0'
s[len-offset] = '\0';
}
其中offset表示的是到目前为止遇到了几个空格、制表符或者换行符。但是本质上表示两个数组之间,对应元素之间的偏移量。这句话怎么理解?可以看下面这幅图理解:
原数组表示字符串在之前字符串数组中的位置,新数组表示我们去掉空格、制表符和换行符应该得到的新数组。offset就表示原数组和新数组对应字符之间索引的差异。
算法的流程图如下:
这个算法中还涉及到字符串常量和字符串数组的问题,有关问题我就不在这里赘述了,可以参考一下下面这一个博客。
[1] https://www.cnblogs.com/tongye/p/10688941.html
2 find_arg()函数
find_argv()函数能够查找某个二维数组中是否包含某个参数,如果有的话,就返回1,否则返回0。这对应着python中的find函数。
void del_arg(int argc, char **argv, int index)
{
int i;
// 我们遍历到倒数第二个元素,然后将倒数第一个元素置为0
for(i = index; i < argc-1; ++i) argv[i] = argv[i+1];
// 数字0
argv[i] = 0;
}
int find_arg(int argc, char* argv[], char *arg)
{
int i;
for(i = 0; i < argc; ++i) {
// 一般来说这边是break;但是这里使用continue更好一些,不对其进行处理
if(!argv[i]) continue;
if(0==strcmp(argv[i], arg)) {
// 删除函数就是将这个元素覆盖,多余的位置用0表示
del_arg(argc, argv, i);
return 1;
}
}
return 0;
}
(1) del_arg函数是说,我们要“删除”指定位置上的元素。这里的删除并不是真的删除,而是将这个位置上的数据置为0。当在find_arg函数中遍历到0的时候,我们跳过该元素,并不进行处理。
(2) find_arg函数是说,我们遍历整个数组,如果遍历到的字符串和要寻找的字符串相同,我们就返回1;如果遍历完整个数组都没有找到,那么我们就返回0.
在测试二维数据的时候,遇到了二维数据初始化的问题。主要就是将如何初始化二维指针,参考下面的博客
[2] https://www.cnblogs.com/shadowfish/p/11750438.html