反转字符串,但指定的子串不翻转 -- C语言

原理

首先把整个字符串反转过来,然后用查找子串的函数找到子串,再翻转回来

代码实现

char * mystrstr(char * str, char * sub){
	if(NULL == str || NULL == sub){
		printf("mystrstr param error\n");
		return NULL;
	}

	char * p = NULL, * q = NULL, * c = NULL;
	int found = 0;

	p = str;
	while(*p != '\0'){

		q = sub;
		c = p;
		while(*c == *q && *q != '\0'){
			q++;
			c++;
		}

		if('\0' == *q){
			found = 1;
			break;			
		}
		p++;
	}

	if(1 == found){
		return p;
	} else {
		return NULL;
	}
}



int strReverse(char * head, char * tail){
	if(NULL == head || NULL == tail){
		printf("strReverse param error!\n");
		return PARAM_ERR;
	}
	
	char tmp;

	while(head < tail){
		tmp = *head;
		*head = *tail;
		*tail = tmp;

		head++;
		tail--;
	}
	
	return SUCCESS;
}


int strReversWithoutSubstr (char * str, char * substr){
	if(NULL == str || NULL == substr){
		printf("strReverse param error!\n");
		return PARAM_ERR;
	}

	int len = 0, sublen = 0;
	char * head = NULL, * tail = NULL;
	char * p = NULL, * q = NULL;

	/*1. 整个字符串颠倒*/
	len  = strlen(str);
	head = str;
	tail = str + len - 1;
	strReverse(head, tail);

	/*2. 把子串颠倒*/
	len  = strlen(substr);
	head = substr;
	tail = substr + len - 1;
	strReverse(head, tail);
	
	
	/*3. 把子串颠倒回来*/
	sublen = strlen(substr);
	head = mystrstr(str, substr);
	tail = head + sublen - 1;
	strReverse(head, tail);

}




void testReverse(void){
	char str[100] = "Feng is from Beijing!";
	char sub[100] = "from";
	char * head = NULL, * tail = NULL;
	int len  = 0;

	printf("\n************  testReverse ************ \n");

	
	strReversWithoutSubstr(str, sub);
	printf("Reverse string without substr is : %s\n\n", str);


	return;

}

代码编译

gcc main.c str.c -g -o a.exe

调试输出

************  testReverse ************

Reverse string without substr is : !gnijieB from si gneF

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值