最近在看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