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

求解一个关于指针的有关问题,请各位大侠不吝赐教

2013-08-14 
求解一个关于指针的问题,请各位大侠不吝赐教![color#00FF00][color#00FF00]今天本人写了一个字符串处理

求解一个关于指针的问题,请各位大侠不吝赐教!
[color=#00FF00][color=#00FF00]

今天本人写了一个字符串处理函数,从原字符串中找到某些符合要求的子字符串  然后有个特定的字符串替换该子字符串。所有的功能模块运行良好 但是 在 void replace(int& i,int& len,int& len1,int& len2);这个函数中 遇到了一个问题 始终没解决,就是replace函数处理字符串之前传递进去的字符串居然输出是乱码 不知道是怎么回事 我在程序相应的地方已经标注 求大侠指教!
我输入的是:strSrc = abcabc     strFind = a   strReplace  = bh
#include <stdio.h>
#include <stdlib.h>
//函数声明
 void menu(void);
 void StrReplace(void);
 void get_len(int& len,int& len1,int& len2);
 void replace(int& i,int& len,int& len1,int& len2);

 char* strSrc;//三个待处理的字符串
 char* strFind;
 char* strReplace;

//主函数
int main(void)
{
 //先申请空间
 strSrc = (char*)malloc(sizeof(char));
 strFind = (char*)malloc(sizeof(char));
 strReplace = (char*)malloc(sizeof(char));
 //输入函数
 menu();
 //替换函数
 StrReplace();
 return 0;

}

void menu(void)
{
 printf("请输入原字符串:");//在标准输入流中的表现空格和字符串的结尾相同
 scanf("%s",strSrc);
 printf("您输入的字符串是:%s\n",strSrc);

 printf("请输入查找子字符串:");
 scanf("%s",strFind);
 printf("您输入的字符串是:%s\n",strFind);

 printf("请输入替换字符串:");
 scanf("%s",strReplace);
 printf("您输入的字符串是:%s\n",strReplace);
}

void StrReplace(void)
{
   //三个字符串的长度
int len=0;
int len1=0;
int len2=0;
int count=0;//计数
int count1=0;
//得到长度
get_len(len,len1,len2);
printf("三个长度:%d  %d  %d\n",len,len1,len2);
    //先判断长度
if(len<len1)
{
 printf("数据错误!\n");
 return;
}
if(len1==len2)
{
 for(int m=0;m<len1;m++)
 {
  if(*(strFind+m) != *(strReplace+m))
  break;
  else count++; 
 }
if(count == len1)
{
 printf("输入的字串相同\n");
 return;
}
}
   count=0;
    //寻找符合要求的字串
for(int i=0;i<len;i++)
{
if(*strFind == *(strSrc+i))//向后遍历比较
{

                   if((i+len1)>len)
 break;

 for(int j=i;j<i+len1;j++)


 {
  if(*(strSrc+j) != *(strFind + j - i))
  break;
  else count++;
 }

                if(count == len1)//找到了字串
{
  printf("%s\n",strSrc);[color=#FF9900][color=#000080]//这里我先输出了要被replace处理的strSrc 一切正常[/color]
  replace(i,len,len1,len2);
  count=0;
  i--;
}
else
 count=0;//重新计数
}
}
}

void get_len(int& len,int& len1,int& len2)
{
 while(*(strSrc+len) != '\0')
 len++;
 while(*(strFind+len1) != '\0')
 len1++;
 while(*(strReplace+len2) != '\0')
 len2++;
 return;
}

 void replace(int& i,int& len,int& len1,int& len2)
 {
   char str[1000];
   int count1=0;

   printf("%s\n",strSrc);//在每次的处理之前 我会先输出strSrc 但是第二次或是第二次之后调用的时候这里是乱码 不知道为什么

  //替换的时候还可能会产生不同长度的替换
  
  if(len1==len2)//长度相等
  {
   for(int k=i;k<i+len1;k++)
   *(strSrc + k) = *(strReplace+k-i);

       printf("尝试输出:\n");
   for(int b=0;b<len;b++)
 printf("%c",strSrc[b]);
     printf("\n");
        
  }
  else//长度不相等且替换的长这里由于长度的限制可能会出错
  {
       for(int j=0;j<i;j++)
       *(str+j) = *(strSrc+j);

       for(j;j <i+len2;j++)
       *(str+j) = *(strReplace+j-i);

       for(j;j<len-len1+len2;j++)
   {
      *(str+j) = *(strSrc+i+len1+count1);
      count1++;
   }
        strSrc = str;
    //长度改变了 
    len = len-len1+len2;
    *(strSrc+len)='\0';
    printf("%s\n",strSrc);
  }
}
[/color][/color][/color]

C语言 指针 问题
[解决办法]
仅供参考

#include <stdio.h>
#include <string.h>
#include <locale.h>
char s[256];
char *p;
int r,n,i;
int main() {
    setlocale(LC_ALL,"chs");
    while (1) {
        printf("请输入一行文字(空行结束),"%%20"将替换为" ","你懂得"将替换为"XXXXXX":\n");
        fgets(s,256,stdin);
        if ('\n'==s[0]) break;
        p=s;
        while (1) {
            p=strstr(p,"%20");
            if (p) {
                memmove(p+1,p+3,strlen(p)-3+1);
                p[0]=' ';
            } else break;
        }
        p=s;
        while (1) {
            p=strstr(p,"你懂得");
            if (p) {
                memmove(p+6,p+6,strlen(p)-6+1);
                for (i=0;i<6;i++) p[i]='X';
            } else break;
        }
        printf("%s",s);
    }
    return 0;
}
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//abcdefg%20helloworld%20something.pdf
//abcdefg helloworld something.pdf
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//这是测试文字你懂得,在这个你懂的地方,就得做你懂得的事


//这是测试文字XXXXX,在这个你懂的地方,就得做XXXXX的事
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//



[解决办法]

结贴是个号习惯

热点排行