首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于memset清零的疑点

2013-03-19 
关于memset清零的疑问?本帖最后由 zhouchichi203 于 2013-03-04 15:41:04 编辑//1、删除子串,只要是原串中

关于memset清零的疑问?
本帖最后由 zhouchichi203 于 2013-03-04 15:41:04 编辑

//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时程序不能得到预期结果,有谁能帮忙分析下吗?谢谢啦~
[解决办法]
C风格字符串是一个以空字符'\0'为结束标志的字符数组。如果没有'\0'字符串就不能正常结束,所以经常出现在正确的结果后跟着一堆连七八糟的东西。所以在向一个字符串数组赋值时经常使用memset将其每个元素都置为0.
[解决办法]
#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;
}



热点排行