该函数实现的功能是:删除字符串中间的*,该字符串只有字母和*
其中h指向字符串第一个字母,p指向最后一个字母,a是给定的字符串
例如字符串为****A**DE***,h指向A的位置,p指向E的位置,结果为
****ADE***
我自己写出来一个但是不知道哪里有问题求解答
void fun(char a, char *h,char *p)
{
char *q;
q=a;
while(*q=='')
q++;
while(h!=p)
{
if(*h!='*')
{*q=*h;q++;h++;}
else
h++;
}
}
#include <stdio.h>
#include <string.h>
#include <malloc.h>
// 将strRes中的t替换为s,替换成功返回1,否则返回0。
int StrReplace(char strRes[],char from[], char to[]) {
int i,flag = 0;
char *p,*q,*ts;
for(i = 0; strRes[i]; ++i) {
if(strRes[i] == from[0]) {
p = strRes + i;
q = from;
while(*q && (*p++ == *q++));
if(*q == '\0') {
ts = (char *)malloc(strlen(strRes) + 1);
strcpy(ts,p);
strRes[i] = '\0';
strcat(strRes,to);
strcat(strRes,ts);
free(ts);
flag = 1;
}
}
}
return flag;
}
int main() {
char str[80] = "098123asd098opu";
printf("替换前:%s\n",str);
if(StrReplace(str,"098","33210")) printf("替换后:%s\n",str);
else printf("没有任何替换。\n");
return 0;
}
给个例子你参考
你这个写的乱七八糟的,思路其实很简单,两层循环,先找到第一个字母,然后第一层的内容是保证在第一个字母和最后一个字母里循环即可,第二层是判断,如果是星号的话,就把字符串里的字符前移一位,自己尝试写一下
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
void fun(char *targetBuf) {
if (NULL == targetBuf)
{
return;
}
//"*********A**DB***"
//1.从左边找到第一个非'*'字符的位置
char *pTemp = targetBuf;
while('*' == *pTemp)
{
pTemp = pTemp + 1;
}
//如果找到字符串结尾都没有字母
if(strlen(targetBuf) < pTemp - targetBuf + 1)
{
printf("字符串里只有 '*', 没有字母\n");
return;
}
//保存第一个字母的指针
char *pFirstLetter = pTemp;
//2.从右边找到第一个非'*'字符的位置
pTemp = targetBuf + strlen(targetBuf) - 1;
while('*' == *pTemp)
{
pTemp = pTemp - 1;
}
//保存最后一个字母的指针
char *pEndLetter = pTemp;
//如果整个字符串只有一个字母
if (pFirstLetter == pEndLetter)
{
return; //不需要处理
}
char *i = NULL;
char *j = NULL;
for(i = pFirstLetter + 1 ; i <= pEndLetter; ) {
if ('*' == *i) //pFirstLetter右边第一个'*'的位置
{
for(j = i; j < pEndLetter; j++)
{
*j = *(j + 1);
}
*pEndLetter = '*';
pEndLetter = pEndLetter -1;
continue;
}
i = i + 1;
}
}
int main() {
//"*********A**DB***";
char *a = malloc(strlen("*********A**DB***") + 1);
sprintf(a, "*********A**DB***");
printf("%s\n", a);
fun(a);
printf("%s\n", a);
free(a);
return 0;
}