关闭

字符串的简单处理

标签: 匹配数据结构
388人阅读 评论(0) 收藏 举报
分类:

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

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;
}
0
0
查看评论

jsp页面中对时间戳字符串格式化为时间标签

datetag.tld文件:   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"   "http://java.sun.com/dtd/web-jsptaglibra...
  • yangshijin1988
  • yangshijin1988
  • 2013-11-22 18:42
  • 1521

简单的Unicode字符串例子 uniFile.py

这个简单的例子中,把一个Unicode字符串写入到磁盘文件,然后再把它读出并显示出来。
  • Stinky_kiss
  • Stinky_kiss
  • 2014-09-02 17:56
  • 310

字符串的简单处理

字符串的简单处理 /* 串的处理 在实际的开发工作中,对字符串的处理是最常见的编程任务。本题目即是要求程序对用户输入的串进行处理。具体规则如下: 1. 把每个单词的首字母变为大写。 2. 把数字与字母之间用下划线字符(_)分开,使得更清晰 3. 把单...
  • u010512579
  • u010512579
  • 2013-12-21 09:08
  • 475

字符串的简单处理~~

首字母大写,字母和数字之间要用_连起来,多余的空格去掉  package code; import java.util.Scanner; import java.util.Vector; public class D...
  • MayJay517
  • MayJay517
  • 2017-11-02 22:53
  • 53

简单字符串的处理

// 字符串处理.cpp : 定义控制台应用程序的入口点。 // 1.  把每个单词的首字母变为大写。 // 2.    把数字与字母之间用下划线字符(_)分开,使得更清晰 // 3.    把单词中间有多个空格的调整为1个空格。 // ...
  • sozenvN
  • sozenvN
  • 2013-11-07 16:46
  • 324

字符串简单匹配算法

KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n),KMP匹配算法,可以证明它的时间复杂度为O(m+n).。
  • sxh850297968
  • sxh850297968
  • 2015-04-23 09:23
  • 1550

简单的字符串加密算法

简单的字符串加密算法
  • danjuan123
  • danjuan123
  • 2016-08-26 09:25
  • 4843

字符串简单加密算法

题目描述 输入一个字符串,其中字符串小写字母a 到 z组成。请将此字符串进行加密: 1、将字符串前半部分每个字符减1,后半部分每个字符加1。比如d减1变为c。 2、如果字符串长度为奇数,中间字符不作处理。 3、字符为a、z时做循环处理。比如,字符为a,减1为z;字符为z,...
  • u011190556
  • u011190556
  • 2013-09-07 22:35
  • 2056

简单的字符串匹配算法

一 串的基本运算 这是要
  • XSF50717
  • XSF50717
  • 2014-10-11 15:15
  • 1159

一个简单的字符串加密程序

#include #include   #define LODWORD(_qw) ((unsigned long)(_qw)) #define HIDWORD(_qw) ((unsigned long)(((_qw) >> 32) & 0xfffff...
  • s1986q
  • s1986q
  • 2017-09-03 10:00
  • 524
    个人资料
    • 访问:207629次
    • 积分:3700
    • 等级:
    • 排名:第10402名
    • 原创:163篇
    • 转载:5篇
    • 译文:0篇
    • 评论:117条
    友情链接
    最新评论