华为上机题(1)

题目:删除子串,只要是原串中有相同的子串就删掉,不管多少个,返回子串个数。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

int f(const char *str,const char *sub_str,char *result)
{
    assert((str != NULL) && (sub_str != NULL));
	const char *p = str;
	const char *q = sub_str;
	char *t = result;

	int len = strlen(q); //子串长度
	int count = 0;

	while(*p)
	{
		if(*p == *q)
		{
			char *temp = (char*)malloc(len + 1);		
			memset(temp,'\0',len+1);
//			char *temp = new char[len+1];
			strncpy(temp,p,len);
			if(strcmp(temp,sub_str) == 0)
			{
				++count;
				p = p + len;

			}
			else
				*t++ = *p++;

			free(temp);
		}
		else
            *t++ = *p++; 
	}
	return count;
}



int main()
{
	char s[100] = "";
	int num = f("123abc12de234fghi34j123k","123",s);
	printf("The number of sub_str is %d\n",num);
	printf("The result string is %s\n",s);

	return 0;
}

针对于这一道题来说,里面还是有很多值得去思考的地方:如const的运用,assert宏,动态分配内存并赋初值和内存释放,各种字符串处理函数的熟悉程度;

最后有一个地方要提出来assert是一个宏而非函数;

参考资料:http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值