linux下strcat連接字符串發生字符內容部分丟失的錯誤——困擾兩天的神奇BUG

這裏的需求是這樣的:

我是想把下面這段話中的[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會這樣,這就是個謎題了,希望有人能給出更完整的解答,我可能充其量只是給了個解決策略吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章