字符丢失 linux,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打印了出来,打印结果如下:

4a088b3f2139f39897267988d4918663.png

可以看到第一个出现的[1]已经被截掉了,而且这两个字符串也没有任何异常,只需要简单拼接,是肯定没有问题的,可就在strcat那行之后,我又立马打印了一下拼接后的字符串str:

b7220e881898ad98723a180368633792.png

一拼在一起结果就发生了很多错误,比如[131][136]变成了[13136],[164]前面莫名其妙多出了一个[6]等等,我以为是我自己写错了代码才这样,可同样的代码,我放到了windows环境下用vs编译器编译运行,结果如下:

a5f78e3cd84a5803c9302050deef4a50.png

拼接一切正常啊,不仅如此,最终结果也正确输出了:

cf6126ba01cb3dca6e0204fad95408b7.png

你说这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;

}

就这样,再运行一下:

6baa18958a22ca6bbe5e5730505d1f47.png

老铁没毛病

至于为啥linux下运行strcat会这样,这就是个谜题了,希望有人能给出更完整的解答,我可能充其量只是给了个解决策略吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值