字符串操作.docx

上传人:b****5 文档编号:3655018 上传时间:2022-11-24 格式:DOCX 页数:17 大小:17.60KB
下载 相关 举报
字符串操作.docx_第1页
第1页 / 共17页
字符串操作.docx_第2页
第2页 / 共17页
字符串操作.docx_第3页
第3页 / 共17页
字符串操作.docx_第4页
第4页 / 共17页
字符串操作.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

字符串操作.docx

《字符串操作.docx》由会员分享,可在线阅读,更多相关《字符串操作.docx(17页珍藏版)》请在冰豆网上搜索。

字符串操作.docx

字符串操作

#include"string.h"

 

//初始化

void init(mystring*string)

{

    string->p=NULL;

    string->realLength=0;

}

voidinitWithLength(mystring*string,intlength)//开辟长度 内存清0

{

    string->p=(char*)calloc(length,sizeof(char));//分配内存并清0

    string->realLength=length;

}

voidinitWithString(mystring*string,char*copystring)//初始化字符串并拷贝

{

    if(NULL==string)

    {

        printf("字符串为空,无法拷贝\n");

        return0;

    }

    intlength=strlen(copystring);//获取字符串长度

    string->p=(char*)calloc(length+1,sizeof(char));//由于此处的calloc已经全部初始化为0 所以下面的操作不需要考虑字符串结束标志

    //strcpy(string->p,copystring);//拷贝字符串

    mystrcpy(string->p,copystring);

    string->realLength=length+1;//设置长度

}

 

//显示字符串

voidshowString(mystring*string)

{

    printf("showString=%s\n",string->p);

}

//获取字符串长度

intmystrlen(char*p)

{

    intlength=0;

    if(NULL==p)

    {

        printf("字符串为空\n");

        return0;

    }

    while(*p!

='\0')

    {

        length++;

        p++;

    }

    returnlength;

}

//字符串拷贝

char*mystrcpy(char*dest,constchar*source)

{

    if(NULL==dest&&NULL==source)

    {

        printf("字符串为空\n");

        returnNULL;

    }

    char*destbak=dest;

    while(*source!

='\0')

    {

        *dest=*source;//字符赋值

        source++;

        dest++;//指针前移

    }

    *dest='\0';

    returndestbak;//返回地址

}

char*mystrcat(char*dest,constchar*source)

{

    if(!

dest||!

source)

    {

        printf("字符串为空,插入失败\n");

        returnNULL;

    }

    else

    {

        char*destbak=dest;//保留地址

        while((*destbak++)!

='\0');//指针前移

        while((*dest++)!

='\0')//循环并拷贝字符串

        {

            *dest=*source;

            dest++;

            source++;

        }

        *dest='\0';

        returndestbak;

    }

}

//内部字符串当做指令来处理

voidrun(mystring*string)

{

    system(string->p);//执行指令

}

//查找字符串中第一个找到的字符 strchr

char*findFirstChar(mystring*string,charch)

{

    char*p=mystrchr(string->p,ch);//使用自定义函数

    returnp;

}

char*mystrchr(constchar*dest,const charch)

{

    if(NULL==dest)

    {

        returnNULL;

    }

    while(*dest++!

='\0')

    {

        if(*dest==ch)

        {

            returndest;//找到就返回地址

        }

    }

    returnNULL;//没找到返回NULL

}

//查找字符串  strstr

char*findFirstString(mystring*string,char*str)//返回第一个找到的字符串地址

{

    char*pres=mystrstr(string->p,str);

    returnpres;//返回找到字符串的地址

}

char*mystrstr(constchar*constdest,constchar*constfindstr)//避免传递过来的字符串以及地址被随便修改

{

    //判断为空 很重要

    if(NULL==dest||NULL==findstr)

    {

        returnNULL;

    }

    char*destbak=dest;

    char*p=NULL;//保存找到的字符串地址

    while(*destbak!

='\0')

    {

        intflag=1;

        char*findstrbak=findstr;

        char*nowdestbak=destbak;

        while(*findstrbak!

='\0')

        {

            if(*nowdestbak!

='\0')

            {

                if(*findstrbak++!

=*nowdestbak++)

                {

                    flag=0;//不等

                }

            }

            else

            {

                flag=0;

                break;

            }

        }

        if(1==flag)

        {

            p=destbak;

            returnp;

        }

        destbak++;

    }

    returnNULL;

}

//删除字符、字符串

intdeleteFirstChar(mystring*string,constcharch)

{

    //查找

    char*pstr=mystrchr(string->p,ch);

    if(NULL==pstr)

    {

        return0;

    }

    char*pnext=pstr+1;

    //双指针循环

    while(*pnext!

='\0')

    {

        *pstr++=*pnext++;//ok

    }

    *pstr='\0';

    return1;

}

intdeleteFirstString(mystring*string,char*conststr)

{

    char*pres=mystrstr(string->p,str);

    if(NULL==pres)

    {

        return0;

    }

    else

    {

        intlength=mystrlen(str);//字符串长度

        char*pnext=pres+length;

        while(*pnext!

='\0')

        {

            *pres++=*pnext++;

        }

        *pres='\0';//字符串结尾结束标志

        return1;

    }

}

//尾部增加 字符、字符串

voidbackAddChar(mystring*string,charch)

{

    if(strlen(string->p)+1==string->realLength)

    {

        //重新分配内存

        string->p=realloc(string->p,string->realLength+1);

        string->realLength+=1;

        string->p[string->realLength-2]=ch;

        string->p[string->realLength-1]='\0';

    }

    else

    {

        intnowlength=mystrlen(string->p);//求出当前长度

        string->p[nowlength]=ch;

        string->p[nowlength+1]='\0';

    }

}

voidbackAddString(mystring*string,char*str)

{

    intnowmyStringLength=mystrlen(string->p);//获取当前字符串长度

    intaddStringLength=mystrlen(str);//要增加字符串的长度

    if(nowmyStringLength+addStringLength+1>string->realLength)

    {

        intneedAddLength=nowmyStringLength+addStringLength+1-string->realLength;

        //分配内存

        string->p=(char*)realloc(string->p,string->realLength+needAddLength);//增加字符串长度

        mystrcat(string->p,str);//字符串拼接

        string->realLength+=needAddLength;//增加长度

    }

    else

    {

        mystrcat(string->p,str);//拼接字符串

    }

}

//任意位置增加(字符、字符串) 根据地址

voidaddChar(mystring*string,charch,char*pos)

{

    if(NULL==pos||NULL==string)

    {

        returnNULL;

    }

    if(mystrlen(string->p)+1==string->realLength)

    {

        //重新分配内存

        string->p=realloc(string->p,string->realLength+1);

        string->realLength+=1;

        intnowlength=mystrlen(string->p);

        intmovelength=mystrlen(pos);

        for(int i=nowlength; i>nowlength-movelength;i--)

        {

            string->p[i]=string->p[i-1];

        }

        string->p[nowlength-movelength]=ch;//插入

    }

    else

    {

        intnowlength=mystrlen(string->p);//求出当前长度

        intmovelength=mystrlen(pos);//求出现在要移动的长度

        for(inti=nowlength;i>nowlength-movelength;i--)

        {

            string->p[i]=string->p[i-1];

        }

        string->p[nowlength-movelength]=ch;

        string->p[nowlength+1]='\0';

    }

}

voidaddString(mystring*string,char*str,char*pos)

{

    if(NULL==pos||NULL==string)

    {

        return;

    }

    intnowmystringlength=mystrlen(string->p);//获取当前长度

    intaddstringlength=mystrlen(str);//要增加的字符串长度

    if(nowmystringlength+addstringlength+1>string->realLength)//判断是否

    {

        string->p=(char*)realloc(string->p,string->realLength+needaddlength);

        string->realLength+=needaddlength;//增加长度

 

        intnowlength=mystrlen(string->p);//求出当前的长度

        intmovelength=mystrlen(pos);//求出现在要移动的长度

        intinsertlength=mystrlen(str);//要求出插入的长度

 

        for(inti=nowlength;i>=nowlength-movelength;i++)

        {

            string->p[i+insertlength]=string->p[i];//字符移动

        }

        for(intj=0;j

        {

            string->p[nowlength-movelength+j]=str[j];//赋值拷贝

        }

    }

    else

    {

        intnowlength=mystrlen(string->p);//求出当前的长度

        intmovelength=mystrlen(pos);//求出现在要移动的长度

        intinsertlength=mystrlen(str);//要求出插入的长度

 

        for(inti=nowlength;i>=nowlength-movelength;i++)

        {

            string->p[i+insertlength]=string->p[i];//字符移动

        }

        for(intj=0;j

        {

            string->p[nowlength-movelength+j]=str[j];//赋值拷贝

        }

    }

}

 

//任意位置修改(字符、字符串) 根据地址

voidchangeFirstChar(mystring*string,constcharoldchar,constcharnewchar)

{

    char*pstr=string->p;

    while(*pstr!

='\0')

    {

        if(*pstr==oldchar)

        {

            *pstr=newchar;

            return;//如果套替换所有的字符 去掉return即可

        }

        pstr++;

    }

}

voidchangeFirstString(mystring*string,char*constpoldstr,char*constpnewstr)

{

    char*pfind=findFirstString(string,poldstr);

    if(NULL!

=pfind)

    {

        deleteFirstString(string,poldstr);

        addString(string,pnewstr,pfind);

    }

}

3. [文件] main.c ~ 2KB     下载(5)     

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

#include"string.h"

 

voidmain1()

{

    mystringstring1;

    //函数内部改变外部变量需要地址

    initWithString(&string1,"mynameisrocket");

    showString(&string1);

 

    printf("字符串长度:

%d\n",mystrlen(&string1));

    getchar();

}

 

 

voidmain2()

{

    mystringstring1;

// initWithString(&string1,"cal");

// showString(&string1);

// //增加字符

// backAddChar(&string1,'c');

//     run(&string1);

 

//增加字符串

    initWithString(&string1,"note");

    showString(&string1);

 

    backAddString(&string1,"pad");

    showString(&string1);

    run(&string1);

 

    getchar();

}

 

 

 

//测试字符查找函数strchr

voidmain3()

{

    mystringstring1;

    initWithString(&string1,"calaaaa");

    showString(&string1);

    //修改  将找到的一个字符a改为A

    char*pstr=findFirstChar(&string1,'a');

    *pstr='A';

    showString(&string1);

    getchar();

}

 

 

 

//测试strstr mystrstr

void main4()

{

    mystringstring1;

    initWithString(&string1,"calaaaa");

    showString(&string1);

 

    char*pstr=findFirstString(&string1,"laz");

// printf("查找:

%s\n",*pstr);//error

    printf("查找:

%s\n",pstr);

    if(pstr!

=NULL)

    {

        *pstr='Z';

    }

    showString(&string1);

    getchar();

}

 

 

 

//删除(字符、字符串)依赖于查找

voidmain5()

{

    mystringstring1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1