字符串的简单处理

其实我认为计算机存储的东西有两类,一类是数据,一类是字符串,我不想将字符与数据看做一个东西,对于字符需要处理的地方非常多,比如匹配,替换,删除,修改等等,下面我总结下自己今天写的有关字符串处理的几个函数:

StrAssign(chars); //构建一个串S
StrCopy(&S,chars); //将chars串拷贝给S
StrLength(S,&ret); //ret的值就是数组的长度
StrInsert(S,pos,T); //在串S的第pos个字符前插入串T
StrDelete(S,pos,len); //从串S中第pos个字符开始删除len个字符。犯了一个错:是不能将字符串当做数组来改变它的位置的元素值,可以获取值,但是不能将值改变,因为这是常量。
ret = StrCompare(S,T); //比较两个字符串的大小
StrCat(S,T); //将字符串T连接到串S上
SubString(&T,S,pos,len); //在S串中从pos号元素处截取len个元素并且将它赋值给T
ret = StrIndex(S,pos,T); //从主串S串的下标为pos开始,遇到T串完全匹配就返回第一个下标
StrReplace(S,T,R); //将主串S中所有的串T都用R串替换掉。

下面附上代码:

#include<stdio.h>
#include<stdlib.h>
char *StrAssign(char *);
void StrCopy(char **,char *);
void StrLength(char *,int *);
char *StrInsert(char *,int,char *);
char *StrDelete(char *,int,int);
int StrCompare(char *,char *);
void StrCat(char *,char *);
void SubString(char **,char *,int,int);
int StrIndex(char *,int,char *);
void StrReplace(char *,char *,char *);

void StrReplace(char *S,char *T,char *R) //将主串S中所有的串T都用R串替换掉
{
    int num,numt;
    StrLength(T,&numt);
    char *W;
    while((num = StrIndex(S,0,T)) != -1)
    {
        W = StrDelete(S,num,numt);
        S = StrInsert(W,num,R);
    }
    printf("%s\n",S);
}
int StrIndex(char *S,int pos,char *T)//从主串S串的下标为pos开始,遇到T串完全匹配就返回第一个下标,没有找到就返回0
{
    int i,j,s;
    int num1,num2;
    StrLength(S,&num1);
    StrLength(T,&num2);
    for(i = pos;i < num1;i++) {
        for(s = i,j = 0;j < num2;j++,s++) {
            if(S[s] != T[j]) {
                break;
            }
        }
        if(j == num2) {
            return s-num2;
        }
    }
    return -1;
}
void SubString(char **T,char *S,int pos,int len) //在S串中从pos号元素处截取len个元素并且将它赋值给T
{
    char data[len];
    int i,j = 0;
    for(i = pos;i < pos+len;i++) {
        data[j++] = S[i];
    }
    data[j] = '\0';
    *T = data;
}
void StrCat(char *S,char *T) //将字符串T连接到串S上
{
    int i,num,j = 0;
    StrLength(S,&num);
    char ch;
    char R[100];
    for(i = 0;i < num;i++) {
        R[i] = S[i];
    }
    while((ch = T[j++]) != '\0') {
        R[i++] = ch;
    }
    R[i] = '\0';
    printf("%s\n",R);

}
int StrCompare(char *S,char *T) //比较两个字符串的大小
{
    int i,num1,num2;
    StrLength(S,&num1);
    StrLength(T,&num2);
    if(num1 < num2) {
        for(i = 0;i < num1;i++)
        {
            if(S[i] != T[i]) {
                return S[i]-T[i];
            }
        }
        return -1;
    }
    if(num1 > num2) {
        for(i = 0;i < num2;i++)
        {
            if(S[i] != T[i]) {
                return S[i]-T[i];
            }
        }
        return 1;
    }
    if(num1 == num2) {
        for(i = 0;i < num2;i++)
        {
            if(S[i] != T[i]) {
                return S[i]-T[i];
            }
        }
        return 0;
    }
}
char *StrDelete(char *S,int pos,int len)//从串S中第pos个字符开始删除len个字符。
{
    int i = 0,j = 0,num;
    StrLength(S,&num);
    char *R = (char *)malloc(100 * sizeof(char)); 
    char ch;
    for(i = 0;i < pos;i++) {
        R[i] = S[i];
    }
    j = pos+len;
    while((ch = S[j++]) != '\0') {
        R[i++] = ch;
    }
    R[i] = '\0';
    return R;

}
char *StrInsert(char *S,int pos,char *T) //在串S的第pos个字符前插入串T
{
    char ch;
    int i = 0,j = 0,k = 0;
    char *R = (char *)malloc(100 * sizeof(char)); 
    //此处是直接定义数组还是malloc呢,这还是有点讲究的,因为声明数组的话是在栈上,
    //当这个函数结束之后,栈的空间会被释放掉,也就是你如果将数组名return回去,那么如果那块内存空间目前没有人使用的话,你用返回
    //的数组名还是正常的,但是如果这块内存空间万一被别人使用,那么这将导致段错误,要是这块内存使用malloc开辟的,那么它就存在于堆
    //上,这样即使函数结束,也不影响。
    for(j = 0;j < pos;j++) {
        R[i++] = S[j];
    }
    while((ch = T[k++]) != '\0') {
        R[i++] = ch;
    }
    while((ch = S[j++]) != '\0') {
        R[i++] = ch;
    }
    R[i] = '\0';
    return R;
}
void StrLength(char *S,int *ret)//ret的值就是数组的长度
{
    char ch;
    int i = 0;
    while((ch = S[i++]) != '\0');
    *ret = i-1;
}
void StrCopy(char **S,char *chars) //将chars串拷贝给S
{
    *S = chars;   
}
char *StrAssign(char *chars)//构建一个串S
{
    char *S;
    S = chars;
    return S;
}


int main(int argc,char *argv[])
{
    int ret;
    char *T = "bo";
    char *S = "yangbodongbodongbodongbodong";
    char *R = "XXX";
    char *chars;
    S = StrAssign(chars);  //构建一个串S
    StrCopy(&S,chars);     //将chars串拷贝给S
    StrLength(S,&ret);     //ret的值就是数组的长度
    StrInsert(S,4,T);      //在串S的第四个字符前插入串T
    StrDelete(S,4,2);      //从串S中第四个字符开始删除两个字符。犯了一个错
                           //是不能将字符串当做数组来改变它的位置的元素值,可以获取值,但是不能将值改变,因为这是常量。
    ret = StrCompare(S,T); //比较两个字符串的大小
    StrCat(S,T);           //将字符串T连接到串S上
    SubString(&T,S,4,6);   //在S串中从4号元素处截取6个元素并且将它赋值给T
    ret = StrIndex(S,2,T); //从主串S串的下标为2开始,遇到T串完全匹配就返回第一个下标          
    StrReplace(S,T,R);     //将主串S中所有的串T都用R串替换掉。
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨博东的博客

请我喝瓶可乐鼓励下~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值