关于memset清零的疑问?

syscofield 2013-03-04 03:36:02
//1、删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
int delete_sub_str(const char *str,const char *sub_str,char *result)
{
assert(str != NULL && sub_str != NULL);
const char *p,*q;
char *t,*temp;
p = str;
q = sub_str;
t = result;
int n,count = 0;
n = strlen(q);
temp = (char *)malloc(n+1);
memset(temp,0x00,n+1);
while(*p)
{
memcpy(temp,p,n);
if(strcmp(temp,q) == 0 )
{
count++;
memset(temp,0x00,n+1);
p = p + n;
}
else
{
*t = *p;
p++;
t++;
memset(temp,0x00,n+1);
}
}
free(temp);
return count;
}

void main()
{
char s[100] = {'\0'};//把s字符数组置空
int num = delete_sub_str("123abc12de234fg1hi34j123k","123",s);
printf("The number of sub_str is %d\n",num);
printf("The result string is %s\n",s);
}


为什么要用memset清零?3个memset一个不能少,不用memset时程序不能得到预期结果,有谁能帮忙分析下吗?谢谢啦~
...全文
258 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuachua66 2013-03-05
  • 打赏
  • 举报
回复
引用 10 楼 zhouchichi203 的回复:
引用 2 楼 chuachua66 的回复:我觉得,主要原因是这个程序写错了。。。。 memcpy(temp,p,n);这个明显越界嘛!????????????????
p++了,n没变,还在memcpy(temp,p,n),拷的后面的都是不属于P的部分,就越界了啊,越界有读越界和写越界。
赵4老师 2013-03-05
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上!
mymtom 2013-03-05
  • 打赏
  • 举报
回复
引用 1 楼 lin5161678 的回复:
乱用memset 明明 temp[i] = '\0';把某一个元素赋值为0就好了
英明 ++
syscofield 2013-03-05
  • 打赏
  • 举报
回复
引用 2 楼 chuachua66 的回复:
我觉得,主要原因是这个程序写错了。。。。 memcpy(temp,p,n);这个明显越界嘛!
????????????????
FancyMouse 2013-03-04
  • 打赏
  • 举报
回复
疯了。吉祥物2号都出来了。
qq120848369 2013-03-04
  • 打赏
  • 举报
回复
引用 6 楼 qq120848369 的回复:
C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include <stdio.h>#include <stdlib.h>#include <string.h> int delete_sub_str(const char *s……
[root@AY13030413182716680b ~]# ./optimize raw_used=3217984 [root@AY13030413182716680b ~]# ./raw raw_used=5249418 简单一测, 跑1000万次可以差出2秒.
zhao4zhong2 2013-03-04
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
qq120848369 2013-03-04
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int delete_sub_str(const char *str, const char *sub_str, char *result, int result_size)
{
    if (!str || !sub_str || !result)
        return -1;
    
    int str_len = strlen(str);
    int sub_len = strlen(sub_str); 
    int str_pos = 0;
    int res_pos = 0;
    int cnt_sub = 0;
    
    while (str_pos < str_len && res_pos < result_size) {
        int left = str_len - str_pos;
        if (left < sub_len) {
            int res_left = result_size - res_pos;
            if (res_left < left)
                return -1;
            memcpy(result + res_pos, str + str_pos, left);
            res_pos += left;
            break;
        }
        if (!memcmp(str + str_pos, sub_str, sub_len)) {
            str_pos += sub_len;
            cnt_sub++;
        } else {
            result[res_pos++] = str[str_pos++];
        }
    }
    if (res_pos >= result_size)
        return -1;
    result[res_pos] = '\0';
    return cnt_sub;
}

int main(int argc, char *const argv[])
{
    char s[100] = { '\0' };
    int num = delete_sub_str("123abc12de234fg1hi34j123k", "123", s, 100);
    if (num >= 0) {
        printf("The number of sub_str is %d\n", num);
        printf("The result string is %s\n", s);
    }
    return 0;
}
starytx 2013-03-04
  • 打赏
  • 举报
回复
C风格字符串是一个以空字符'\0'为结束标志的字符数组。如果没有'\0'字符串就不能正常结束,所以经常出现在正确的结果后跟着一堆连七八糟的东西。所以在向一个字符串数组赋值时经常使用memset将其每个元素都置为0.
qq120848369 2013-03-04
  • 打赏
  • 举报
回复
因为字符串需要\0结尾才能拿来strcmp呀. 这代码太烂了, 这temp的拷贝纯属浪费性能啊,接口设计也有内存泄露风险啊。
赵4老师 2013-03-04
  • 打赏
  • 举报
回复
仅供参考
#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":
//


chuachua66 2013-03-04
  • 打赏
  • 举报
回复
我觉得,主要原因是这个程序写错了。。。。 memcpy(temp,p,n);这个明显越界嘛!
lin5161678 2013-03-04
  • 打赏
  • 举报
回复
乱用memset 明明 temp[i] = '\0';把某一个元素赋值为0就好了

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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