這裏的需求是這樣的:
我是想把下面這段話中的[1]給全部刪掉:
find[[1][118][131][136][164][19][2][315][316][32][352][355][358][4][400][423][432][433][434][435][436][473][475][495][516][518][522][551][604][609][84]]
news[[1][10][19][2][354][4][464][493]]
watch[[1]]
business[[1][139][146][224][28][354][4]]
words[[1][344][369][88]]
所以我用到了自己寫好的字符串子串刪除函數,打算簡單地進行一下處理:
char* delete_substr(char* str, char* sub_str) {
int i = 0;
int sub_len = strlen(sub_str);
char* temp = (char*)malloc(sizeof(char)*(sub_len+1));
while(str[i] != 0) {
if(str[i] == sub_str[0]) {
strncpy(temp, str + i, sub_len);
temp[sub_len] = 0;
if(!strcmp(temp,sub_str)) {//如果找到了相匹配的字符串,就從字符串中刪掉它
str[i] = 0;
strcat(str, str + i + sub_len);
i = 0;
continue;
}
}
i++;
}
return str;
}
可是刪除完竟然得到了下面這樣奇怪的結果:
find[[118][13136][6][164][19][2][315][316][32][352][355][358][4][400][423][43433][434][435][436][473][475][495][516][518][8][522][551][604][609][84]]
news [[10][19][2][354][4][464][493]]
watch []
bness [[ [[139][1[224][4][28][354][4]]
words [[344][369][88]]
總之是各種不對,經過排查,我發現是strcat這個函數出現了內部的問題,我是怎麼發現的呢?
在使用strcat進行拼接之前,我將要拼接的兩段字符串:str與str+i+sub_len打印了出來,打印結果如下:
可以看到第一個出現的[1]已經被截掉了,而且這兩個字符串也沒有任何異常,只需要簡單拼接,是肯定沒有問題的,可就在strcat那行之後,我又立馬打印了一下拼接後的字符串str:
一拼在一起結果就發生了很多錯誤,比如[131][136]變成了[13136],[164]前面莫名其妙多出了一個[6]等等,我以爲是我自己寫錯了代碼才這樣,可同樣的代碼,我放到了windows環境下用vs編譯器編譯運行,結果如下:
拼接一切正常啊,不僅如此,最終結果也正確輸出了:
你說這BUG你怎麼調?
我無奈之下,只好自己寫了strcat的功能實現,冷靜想想,不就是字符串拼接一下嘛,自己寫唄:
char* delete_substr(char* str, char* sub_str) {
int i = 0;
int sub_len = strlen(sub_str);
int str_len = strlen(str);
str[str_len] = 0;
sub_str[sub_len] = 0;
char* temp = (char*)malloc(sizeof(char)*(sub_len+1));
memset(temp,0,sizeof(char)*(sub_len+1));
while(str[i] != 0) {
if(str[i] == sub_str[0]) {
strncpy(temp, str + i, sub_len);
temp[sub_len] = 0;
if(!strcmp(temp,sub_str)) {//如果找到了相匹配的字符串,就從字符串中刪掉它
int cnt = i;
for(int j = i + sub_len; j < strlen(str); j++) {//相當於strcat函數
str[cnt++] = str[j];
}
str[cnt] = 0;
i = 0;
continue;
}
}
i++;
}
return str;
}
就這樣,再運行一下:
老鐵沒毛病
至於爲啥linux下運行strcat會這樣,這就是個謎題了,希望有人能給出更完整的解答,我可能充其量只是給了個解決策略吧