鱼C论坛

 找回密码
 立即注册
查看: 3441|回复: 2

[已解决]为什么我的replacestr函数错误??

[复制链接]
发表于 2018-4-20 23:16:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 60
typedef struct{
        char *ch;
        int length;
}HString;

void initstr(HString *T) //初始化,产生空串。
{
        T->ch=(char*)malloc(sizeof(char)*MAXSIZE);
        if(!(T->ch))
                printf("对不起,初始化失败。\n");
        else
        {
                T->length=0;
                printf("恭喜你,初始化成功。\n");
        }

}

void creatstr(HString *T) //初始化开辟空间。
{
        char s[MAXSIZE];
        int len,i;
        printf("请输入您想要的字符串:");
        gets(s);
        len=strlen(s);

        for(i=0;i<len;i++)
        {
                T->ch[i]=s[i];
        }
        T->ch[i]='\0';
        T->length=len;
        printf("字符串赋值成功!\n");
}

void printstr(HString *T)
{
        printf("%s\n",T->ch);
        printf("打印成功!\n");
}

void concatstr(HString *T1,HString *T2) //字符串连接
{
        int lengthstr(HString *T);
        int i,j,len1,len2;
        len1=lengthstr(T1);
        len2=lengthstr(T2);
        for(i=len1,j=0;i<=len1+len2;i++)
        {
                T1->ch[i]=T2->ch[j];
                j++;
        }
        T1->length=len1+len2;
}
int lengthstr(HString *T)   //求字符串的长度
{
        int len,i;
        len=0;
        i=0;
        while(T->ch[i]!='\0')
        {
                len++;
                i++;
        }
        printf("您的字符串长度为:%d\n",len);
        return len;
}

void deletesubstr(HString *T,int pos,int len) //删除从pos位置起的len个字符 注意应加上判断删除位置等是否正确,此处省略,有时间请补上。
{
        int i;
        for(i=pos+len-1;i<T->length;i++)
        {
                T->ch[i-2]=T->ch[i];
        }
        T->length=T->length-len;
        T->ch[T->length]='\0';
}

void insertsubstr(HString *T,int pos,HString S) //在pos位置之前插入一个字符串S;
{

        int i,len,j;
        len=S.length;
        for(i=T->length-1;i>=pos-1;i--) //该循环用以使pos字符(包含pos字符)之后的每一个字符后移,为子串腾出位置。
        {
                T->ch[i+len]=T->ch[i];
        }
        T->length=T->length+len;
        T->ch[T->length]='\0';
        i=pos-1;
        for(i,j=0;j<len;j++,i++) //该循环用以将腾出的位置插入子串
        {
                T->ch[i]=S.ch[j];
        }
}
int Indexstr(HString *T,int pos,HString S)//从第pos个字符开始寻找子串S,若找到,则返回其位置。
{
        int i,j;
        i=pos-1;
        j=0;
        while(i<=T->length-1&&j<=S.length-1)
        {
                if(T->ch[i]==S.ch[j])
                {
                        ++i;
                        ++j;
                }
                else
                {
                        i=i-j+1;
                        j=0;
                }
        }
        if(j>=S.length)
        {
                printf("您所需要查询的子串在第%d个位置\n",i-S.length+1);
                return i-S.length+1;
        }
        else
        {
                printf("尚未查询到您需要的子串\n");
                return 0;
        }
}
void replacestr(HString *T,HString T1,HString T2)//将字符串T中等于T1的子串替换成为T2
{
        int Indexstr(HString *,int ,HString );
        void insertsubstr(HString *,int ,HString );
        void deletesubstr(HString *,int ,int );
        int pos;
        pos=0;
        pos=Indexstr(T,1,T1);
        while(pos)
        {
                deletesubstr(T,pos ,T1.length );
                insertsubstr(T,pos ,T2);
                pos=Indexstr(T,pos,T1);
        }
        printf("替换完毕.\n");
}






int main()
{
        HString T1,T2,T3;
        char str[]="hsy";
        char str2[]="cute";
        initstr(&T1);
        creatstr(&T1);
        T2.ch=str;
        T3.ch=str2;
        T2.length=strlen(T2.ch);//T2.length=lengthstr(&T2);
        T3.length=strlen(T3.ch);
        //initstr(&T2);
        //creatstr(&T2);
        //printstr(&T);
        //concatstr(&T1,&T2);
        //lengthstr(&T1);
        //printstr(&T1);
        //deletesubstr(&T1,4,2);
        //insertsubstr(&T1,3,T2);
        //printstr(&T1);
        //Indexstr(&T1,1,T2);
        printstr(&T1);
        replacestr(&T1,T2,T3);
        printstr(&T1);
        return 0;
}
@人造人
最佳答案
2018-4-21 03:43:31
很明显,deletesubstr函数不是预期的那样工作

无标题.png
无标题1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-21 03:43:31 | 显示全部楼层    本楼为最佳答案   
很明显,deletesubstr函数不是预期的那样工作

无标题.png
无标题1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-21 03:57:55 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 60
typedef struct
{
        char *ch;
        int length;
} HString;

void initstr(HString *T) //初始化,产生空串。
{
        //T->ch = (char*)malloc(sizeof(char)*MAXSIZE);        // 听某本书上说,永远都不用写sizeof(char),sizeof(char)恒为1
        T->ch = malloc(MAXSIZE);
        if(!(T->ch))
                printf("对不起,初始化失败。\n");
        else
        {
                T->length = 0;
                printf("恭喜你,初始化成功。\n");
        }

}

void creatstr(HString *T) //初始化开辟空间。
{
        //char s[MAXSIZE];
        //int len, i;
        printf("请输入您想要的字符串:");
        //gets(s);
        //len = strlen(s);

        //for(i = 0; i<len; i++)
        //{
        //        T->ch[i] = s[i];
        //}
        //T->ch[i] = '\0';
        //T->length = len;



        // 为什么要用gets,把字符串get到s,然后再复制到T->ch ?  ^_^
        fgets(T->ch, MAXSIZE, stdin);
        T->length = strlen(T->ch) - 1;        // '\n'
        T->ch[T->length] = '\0';



        printf("字符串赋值成功!\n");
}

void printstr(HString *T)
{
        printf("%s\n", T->ch);
        printf("打印成功!\n");
}

void concatstr(HString *T1, HString *T2) //字符串连接
{
        int lengthstr(HString *T);
        int i, j, len1, len2;
        len1 = lengthstr(T1);
        len2 = lengthstr(T2);
        for(i = len1, j = 0; i <= len1 + len2; i++)
        {
                T1->ch[i] = T2->ch[j];
                j++;
        }
        T1->length = len1 + len2;
}
int lengthstr(HString *T)   //求字符串的长度
{
        int len, i;
        len = 0;
        i = 0;
        while(T->ch[i] != '\0')
        {
                len++;
                i++;
        }
        printf("您的字符串长度为:%d\n", len);
        return len;
}

void deletesubstr(HString *T, int pos, int len) //删除从pos位置起的len个字符 注意应加上判断删除位置等是否正确,此处省略,有时间请补上。
{
        int i;
        for(i = pos + len - 1; i < T->length; i++)
        {
                T->ch[i - len] = T->ch[i];
        }
        T->length = T->length - len;
        T->ch[T->length] = '\0';
}

void insertsubstr(HString *T, int pos, HString S) //在pos位置之前插入一个字符串S;
{

        int i, len, j;
        len = S.length;
        for(i = T->length - 1; i >= pos - 1; i--) //该循环用以使pos字符(包含pos字符)之后的每一个字符后移,为子串腾出位置。
        {
                T->ch[i + len] = T->ch[i];
        }
        T->length = T->length + len;
        T->ch[T->length] = '\0';
        i = pos - 1;
        for(i, j = 0; j<len; j++, i++) //该循环用以将腾出的位置插入子串
        {
                T->ch[i] = S.ch[j];
        }
}
int Indexstr(HString *T, int pos, HString S)//从第pos个字符开始寻找子串S,若找到,则返回其位置。
{
        int i, j;
        i = pos - 1;
        j = 0;
        while(i <= T->length - 1 && j <= S.length - 1)
        {
                if(T->ch[i] == S.ch[j])
                {
                        ++i;
                        ++j;
                }
                else
                {
                        i = i - j + 1;
                        j = 0;
                }
        }
        if(j >= S.length)
        {
                printf("您所需要查询的子串在第%d个位置\n", i - S.length + 1);
                return i - S.length + 1;
        }
        else
        {
                printf("尚未查询到您需要的子串\n");
                return 0;
        }
}
void replacestr(HString *T, HString T1, HString T2)//将字符串T中等于T1的子串替换成为T2
{
        int Indexstr(HString *, int, HString);
        void insertsubstr(HString *, int, HString);
        void deletesubstr(HString *, int, int);
        int pos;
        pos = 0;
        pos = Indexstr(T, 1, T1);
        while(pos)
        {
                deletesubstr(T, pos, T1.length);
                insertsubstr(T, pos, T2);
                pos = Indexstr(T, pos, T1);
        }
        printf("替换完毕.\n");
}

int main()
{
        HString T1, T2, T3;
        char str[] = "hsy";
        char str2[] = "cute";
        initstr(&T1);
        creatstr(&T1);
        T2.ch = str;
        T3.ch = str2;
        T2.length = strlen(T2.ch);//T2.length=lengthstr(&T2);
        T3.length = strlen(T3.ch);
        //initstr(&T2);
        //creatstr(&T2);
        //printstr(&T);
        //concatstr(&T1,&T2);
        //lengthstr(&T1);
        //printstr(&T1);
        //deletesubstr(&T1,4,2);
        //insertsubstr(&T1,3,T2);
        //printstr(&T1);
        //Indexstr(&T1,1,T2);
        printstr(&T1);
        replacestr(&T1, T2, T3);
        printstr(&T1);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 09:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表