最近在看darknet源码,发现其中有很多很实用的函数,总结如下。
strip_args()函数
该函数用于删除s指向的一个字符串中所包含的空格、制表符和换行符。
//参数:
// s 指向被检查的字符串。
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
find_arg()函数
find_argv()函数能够查找某个二维数组中是否包含某个参数,如果有的话,就返回1,否则返回0。
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
来源:
作者:lp_oreo
链接:https://blog.csdn.net/qq_38316300/article/details/107145461