原理
首先把整个字符串反转过来,然后用查找子串的函数找到子串,再翻转回来
代码实现
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