C程序 , 出现了一个bug , 希望有人能帮我看一下,谢谢

ForesterX 2018-03-03 02:16:10
描述 :
找到字符串src中出现的第一个sub子字符串,并替换为new_sub字符串

编辑环境
VS2013

代码如下 : 出现问题的行在注释中已经写清楚了 , 希望有人能帮我看一下 ,谢啦。

#include <stdio.h>
#include <string.h>
#include <malloc.h>

int replaceSubstr(char *src, char** dst, char *sub, char *new_sub);

int main()
{
char p1[] = "abcd11111abcd2222abcdqqqqq";
char * dst = NULL;
replaceSubstr(p1,&dst,"11111","rrr");
free(dst);
return 0;
}

//替换字符串中的指定字符串
int replaceSubstr(char *src, char ** dst, char *sub, char *new_sub)
{
//1.先找字串
char *start = strstr(src, sub);
if (start == NULL)
{
return -1;
}

//2.给dst分配足够大的空间
int length = strlen(src) - strlen(sub) + strlen(new_sub);
*dst = (char *)malloc(length+1);
if (*dst == NULL)
{
return -1;
}
memset(*dst, '\0', length+1);
printf("%d\n", length);

//3.将start标记为0
char c = *start;
*start = '\0';
printf("%d\n", strlen(src));
strcat_s(*dst, strlen(src) , src); //这个地方发生错误 , 有人能帮忙解答一下吗?

//4.恢复 ,将new串添加进去
*start = c;
strcat_s(*dst, strlen(new_sub), new_sub);

//5.将sub后面的cat到dst当中
char * end = start + strlen(src) - 1;
end++;
strcat_s(*dst, strlen(end), end);
return 0;
}

...全文
451 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-05
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
char s[256];
char *p;
int r,n,i;
int main() {
    while (1) {
        printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXX\":\n");
        fgets(s,256,stdin);
        if ('\n'==s[0]) break;
        p=s;
        while (1) {
            p=strstr(p,"%20");
            if (p) {
                memmove(p+1,p+3,strlen(p)-3+1);
                p[0]=' ';
            } else break;
        }
        p=s;
        while (1) {
            p=strstr(p,"你懂得");
            if (p) {
                memmove(p+3,p+6,strlen(p)-6+1);
                for (i=0;i<3;i++) p[i]='X';
            } else break;
        }
        printf("%s",s);
    }
    return 0;
}
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXX":
//abcdefg%20helloworld%20something.pdf
//abcdefg helloworld something.pdf
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXX":
//这是测试文字你懂得,在这个你懂的地方,就得做你懂得的事
//这是测试文字XXX,在这个你懂的地方,就得做XXX的事
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXX":
//

ForesterX 2018-03-04
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
仅供参考:
#include <stdio.h>
#include <string.h>
char s[256];
char *p;
int r,n,i;
int main() {
    while (1) {
        printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");
        fgets(s,256,stdin);
        if ('\n'==s[0]) break;
        p=s;
        while (1) {
            p=strstr(p,"%20");
            if (p) {
                memmove(p+1,p+3,strlen(p)-3+1);
                p[0]=' ';
            } else break;
        }
        p=s;
        while (1) {
            p=strstr(p,"你懂得");
            if (p) {
                memmove(p+6,p+6,strlen(p)-6+1);
                for (i=0;i<6;i++) p[i]='X';
            } else break;
        }
        printf("%s",s);
    }
    return 0;
}
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//abcdefg%20helloworld%20something.pdf
//abcdefg helloworld something.pdf
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//这是测试文字你懂得,在这个你懂的地方,就得做你懂得的事
//这是测试文字XXXXX,在这个你懂的地方,就得做XXXXX的事
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//


很高效的办法 , 但是我觉的中文替换那里可能会有点瑕疵 , 如果本地编码是GBK编码这段代码才会有效啊 , 而且你懂得 , 得刚好使用6个ASC的字符才能不会出现乱码 。
ForesterX 2018-03-04
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
strcat_s(*dst, strlen(src) , src); 改成: strcat_s(*dst, length + 1, src); 同理后面的strcat_s strcat_s第二个参数表示的不是字符串长度,而是你缓冲区大小 缓冲区大小设置为字符串长度由于不够存放\0函数检查时后会失败
嗯 。 明白了 , 非常感谢。
ForesterX 2018-03-04
  • 打赏
  • 举报
回复
引用 1 楼 MHY1249 的回复:
#include "stdafx.h" #include <string.h> #include <malloc.h> int replaceSubstr(char *src, char** dst, char *sub, char *new_sub); //替换字符串中的指定字符串 int replaceSubstr(char *src, char ** dst, char *sub, char *new_sub) { //1.先找字串 char *start = strstr(src, sub); if (start == NULL) { return -1; } //2.给dst分配足够大的空间 int length = strlen(src) - strlen(sub) + strlen(new_sub); *dst = (char *)malloc(length+1); if (*dst == NULL) { return -1; } memset(*dst, '\0', length+1); printf("%d\n", length); //3.将start标记为0 char c = *start; *start = '\0'; printf("%d\n", strlen(src)); strcat_s(*dst,length+1 , src); //这个地方发生错误 , 有人能帮忙解答一下吗? //4.恢复 ,将new串添加进去 *start = c; strcat_s(*dst, length+1, new_sub); //5.将sub后面的cat到dst当中 char * end = start + strlen(sub); strcat_s(*dst, length+1, end); return 0; } int _tmain(int argc, _TCHAR* argv[]) { char p1[] = "abcd11111abcd2222abcdqqqqq"; char * dst = NULL; replaceSubstr(p1,&dst,"11111","rrr"); free(dst); return 0; return 0; }
嗯 , 非常感谢,我明白strcat_s函数第二个参数的含义了。
paschen 2018-03-03
  • 打赏
  • 举报
回复
strcat_s(*dst, strlen(src) , src); 改成: strcat_s(*dst, length + 1, src); 同理后面的strcat_s strcat_s第二个参数表示的不是字符串长度,而是你缓冲区大小 缓冲区大小设置为字符串长度由于不够存放\0函数检查时后会失败
赵4老师 2018-03-03
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
char s[256];
char *p;
int r,n,i;
int main() {
    while (1) {
        printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");
        fgets(s,256,stdin);
        if ('\n'==s[0]) break;
        p=s;
        while (1) {
            p=strstr(p,"%20");
            if (p) {
                memmove(p+1,p+3,strlen(p)-3+1);
                p[0]=' ';
            } else break;
        }
        p=s;
        while (1) {
            p=strstr(p,"你懂得");
            if (p) {
                memmove(p+6,p+6,strlen(p)-6+1);
                for (i=0;i<6;i++) p[i]='X';
            } else break;
        }
        printf("%s",s);
    }
    return 0;
}
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//abcdefg%20helloworld%20something.pdf
//abcdefg helloworld something.pdf
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//这是测试文字你懂得,在这个你懂的地方,就得做你懂得的事
//这是测试文字XXXXX,在这个你懂的地方,就得做XXXXX的事
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//


MHY1249 2018-03-03
  • 打赏
  • 举报
回复
#include "stdafx.h" #include <string.h> #include <malloc.h> int replaceSubstr(char *src, char** dst, char *sub, char *new_sub); //替换字符串中的指定字符串 int replaceSubstr(char *src, char ** dst, char *sub, char *new_sub) { //1.先找字串 char *start = strstr(src, sub); if (start == NULL) { return -1; } //2.给dst分配足够大的空间 int length = strlen(src) - strlen(sub) + strlen(new_sub); *dst = (char *)malloc(length+1); if (*dst == NULL) { return -1; } memset(*dst, '\0', length+1); printf("%d\n", length); //3.将start标记为0 char c = *start; *start = '\0'; printf("%d\n", strlen(src)); strcat_s(*dst,length+1 , src); //这个地方发生错误 , 有人能帮忙解答一下吗? //4.恢复 ,将new串添加进去 *start = c; strcat_s(*dst, length+1, new_sub); //5.将sub后面的cat到dst当中 char * end = start + strlen(sub); strcat_s(*dst, length+1, end); return 0; } int _tmain(int argc, _TCHAR* argv[]) { char p1[] = "abcd11111abcd2222abcdqqqqq"; char * dst = NULL; replaceSubstr(p1,&dst,"11111","rrr"); free(dst); return 0; return 0; }

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧