定长串操作

串操作在数据结构中也是十分重要的一部分,首先需要理解串,串长,串相等,空格串,空串,子串的概念。我们在编程过程中,对于字符串的操作,就是一种串结构的使用。

串:是指通常说所的字符串,如:“abcde”,“PI”等
串长:是指字符串的长度,如:“abcde”长度为5,“PI”长度为2
串相等:两个字符串的长度和内容均相等,如:“abcde”和“abcde”
空格串:字符串由一个或多个空格组成,空格串不是空串,空格串有长度,如:“   ”
空串:字符串长度为零,如:“”
子串:一个串的某一部分,如:“abcde”的“a”,“bc”,“bcd”等都是子串

头文件:

/*****************************************************************************************************
 *Copyright:Yue Workstation
 *
 *FileName:FixedLengthString.h
 *
 *Function: 串的相关数据定义和函数声明
 *
 *Author:Abel Lee
 *
 *CreateOn:2011-8-11
 *
 *Log:2011-8-11 创建
 *****************************************************************************************************/ 

#ifndef FIXED_LENGTH_STRING_H
#define FIXED_LENGTH_STRING_H 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "global.h" 

typedef unsigned char SString[MAX_LENGTH + 1];//SString[0]存储串长度 

SString *StringCopy(SString *S, SString T);
SString *StringClear(SString *S);
SString *StringCat(SString *S, const SString T);
SString *StringReplace(SString *S, SString T, SString V);
int StringInstert(SString *S, SString T, int pos);
int StringInit(SString *S, const char *str);
int StringCompare(SString S,SString T);
int StringIndex(SString S, SString T, int pos);
int StringLength(SString S);
int StringDestroy(SString *S);
void StringPrint(SString S);
int StringSub(SString *S, SString T, int pos, int len); 

#endif

源文件:

/*****************************************************************************************************
 *Copyright:Yue Workstation
 *
 *FileName:FixedLengthString.c
 *
 *Function:串的基本操作
 *
 *Author:Abel Lee
 *
 *CreateOn:2011-8-11
 *
 *Log:2011-8-11 创建
 *****************************************************************************************************/ 

#include "../inc/FixedLengthString.h" 

/****************************************************************************************************
 *Function Name:StringCopy
 *
 *Function:串拷贝
 *
 *Parameter:     S:要初始化的串
 *             str:初始化常量值
 *
 *Return Value:成功返回0,失败返回-1
 *
 *Author:Abel Lee
 *
 *Log:2011-9-15
 ***************************************************************************************************/
SString *StringCopy(SString *S, SString T)
{
    int i = 0; 

    if(*S == NULL || T == NULL)
    {
        return NULL;
    } 

    while(T[i])
    {
        (*S)[i] = T[i];
        i++;
    } 

    (*S)[i] = T[i];
    return S;
} 

/****************************************************************************************************
 *Function Name: StringCompare
 *
 *Function: 比较串S和T是否相等
 *
 *Parameter:     S:参加比较的字符串
 *               T:参加比较的字符串
 *
 *Return Value: 相等返回0,S > T 返回1,S < T 返回-1
 *
 *Author:Abel Lee
 *
 *Log:2011-9-16
 ***************************************************************************************************/
 int StringCompare(SString S,SString T)
{
     int i = 0;
     int flag = 0; 

     if(S[0] - T[0] >= 0)
     {
         flag = S[0];
     }
     else
     {
         flag = T[0];
     }
     for(i = 1; i < flag; i++)
     {
         if(S[i] - T[i] > 0)
         {
             return 1;
         }
         else if(S[i] - T[i] < 0)
         {
             return -1;
         }
         else
         { 

         }
     }
     return 0;
} 

 /****************************************************************************************************
  *Function Name: StringClear
  *
  *Function: 清空字符串
  *
  *Parameter:     S:要清空的字符串
  *
  *Return Value: 成功返回S,失败返回NULL
  *
  *Author:Abel Lee
  *
  *Log:2011-9-16
  ***************************************************************************************************/
SString *StringClear(SString *S)
{
    int i = 0; 

    if(S == NULL)
    {
        return NULL;
    } 

    while((*S)[i])
    {
        (*S)[i] = ‘\0‘;
        i++;
    }
    return S;
} 

/****************************************************************************************************
 *Function Name: StringCat
 *
 *Function: 字符串连接,将T连接到S结尾
 *
 *Parameter:     S:原始串
 *               T: 连接串
 *
 *Return Value: 成功返回S,失败返回NULL
 *
 *Author:Abel Lee
 *
 *Log:2011-9-16
 ***************************************************************************************************/
SString *StringCat(SString *S, const SString T)
{
    int i = 1;
    int j = 1; 

    if(S == NULL || T == NULL)
    {
        return NULL;
    } 

    if((*S)[0] + T[0] > MAX_LENGTH)
    {
        return NULL;
    } 

    while((*S)[i])
    {
        i++;
    }
    while(T[j])
    {
        (*S)[i] = T[j];
        i++;
        j++;
    }
    (*S)[i] = ‘\0‘;
    (*S)[0] += T[0];
    return S;
} 

/****************************************************************************************************
 *Function Name: StringSub
 *
 *Function: 在字符串T中从pos处开始截取长度为len的子串存储在S中
 *
 *Parameter:     S:存储子串
 *               T:母串
 *             pos:母串中的位置
 *             len:要截取的串长
 *
 *Return Value: 成功返回0,失败返回-1
 *
 *Author:Abel Lee
 *
 *Log:2011-9-20
 ***************************************************************************************************/
int StringSub(SString *S, SString T, int pos, int len)
{
    int i = 1; 

    if(pos < 1 || pos > T[0] || len < 0 || len > T[0] - pos + 1)
    {
        perror("Input Parameter is error!  pos < 1 || pos > T[0] || len < 0 || len > T[0] - pos + 1\n");
        return -1;
    } 

    (*S)[0] = len;
    while(len--)
    {
        (*S)[i++] = T[pos++];
    }
    (*S)[i] = ‘\0‘; 

    return 0;
} 

/****************************************************************************************************
 *Function Name: StringReplace
 *
 *Function: 用V串替换主串S中所有与T串相等但不重叠的子串
 *
 *Parameter:     S:主串
 *               T:需要在S中查找的原始串
 *               V:需要在S中找到T后替换成的串
 *
 *Return Value: 成功返回子串的位置,失败返回-1
 *
 *Author:Abel Lee
 *
 *Log:2011-9-16
 ***************************************************************************************************/
SString *StringReplace(SString *S, SString T, SString V)
{
    int pos = 1;
    int len = T[0];
    int i = 0;
    SString STemp;
    SString StrLeft; 

    if(len <= 0 || (*S)[0] < T[0])
    {
        perror("Input Parameter is error! len <= 0 || (*S)[0] < T[0]\n");
        return NULL;
    } 

    while((*S)[0] - pos +1 >= len)
    {
        StringSub(&STemp,*S,pos,len);
        if(StringCompare(STemp,T) == 0)
        {
            i = 0;
            while((*S)[i+pos+len-1])
            {
                i++;
                StrLeft[i] = (*S)[i+pos+len-1];
            }
            StrLeft[i] = ‘\0‘;
            StrLeft[0] = i - 1;
            (*S)[pos] = ‘\0‘;
            (*S)[0] = pos -1;
            StringCat(S,V);
            StringCat(S,StrLeft);
            pos = pos + V[0];
            continue;
        }
        pos++;
    } 

    return S;
} 

/****************************************************************************************************
 *Function Name: StringInstert
 *
 *Function:在串S的第pos位置插入串T
 *
 *Parameter:     S:母串
 *               T:被插入的串
 *             pos:插入的位置
 *
 *Return Value: 成功返回0,失败返回-1
 *
 *Author:Abel Lee
 *
 *Log:2011-9-21
 ***************************************************************************************************/
int StringInstert(SString *S, SString T, int pos)
{
    SString StrLeft;
    int i = 1; 

    if((*S)[0] + T[0] > MAX_LENGTH || pos < 1 || pos > (*S)[0] + 1)
    {
        perror("Input parameter is error,(*S)[0] + T[0] > MAX_LENGTH || pos < 1 || pos > (*S)[0] + 1\n");
        return -1;
    } 

    while((*S)[i+pos-1])
    {
        StrLeft[i] = (*S)[i+pos-1];
        i++;
    }
    StrLeft[i] = ‘\0‘;
    StrLeft[0] = i - 1;
    (*S)[pos] = ‘\0‘;
    (*S)[0] = pos -1;
    StringCat(S,T);
    StringCat(S,StrLeft);
    return 0;
} 

/****************************************************************************************************
 *Function Name: StringIndex
 *
 *Function: 字符串索引,在母串S中的pos位置开始查找T,若存在返回母串S中的 位置
 *
 *Parameter:     S:母串
 *               T:子串
 *             pos:串位置
 *
 *Return Value: 成功返回主串中子串的第一次出现的位置,未找到返回0,失败返回-1
 *
 *Author:Abel Lee
 *
 *Log:2011-9-16
 ***************************************************************************************************/
int StringIndex(SString S, SString T, int pos)
{
    int len = T[0];
    SString STemp; 

    if(pos < 1 || S[0] < T[0] || pos > S[0])
    {
        perror("Input Parameter is error! pos < 1 || S[0] < T[0] || pos > S[0]\n");
        return -1;
    } 

    while(S[0] - pos +1 >= len)
    {
        StringSub(&STemp,S,pos,len);
        if(StringCompare(STemp,T) == 0)
        {
            return pos;
        }
        pos++;
    } 

    return 0;
} 

/****************************************************************************************************
 *Function Name:StringInit
 *
 *Function:初始化一个串
 *
 *Parameter:     S:要初始化的串
 *             str:初始化常量值
 *
 *Return Value:成功返回0,失败返回-1
 *
 *Author:Abel Lee
 *
 *Log:2011-9-15
 ***************************************************************************************************/
int StringInit(SString *S, const char *str)
{
    int i = 0;
    const char *p = str; 

    if(strlen(str) > MAX_LENGTH)
    {
        perror("The string length is very large!\n");
        return -1;
    } 

    while(*p != ‘\0‘)
    {
        i++;
        (*S)[i] = *p;
        p++;
    }
    (*S)[0] = i;
    (*S)[++i] = ‘\0‘;
    return 0;
} 

/****************************************************************************************************
 *Function Name:StringInit
 *
 *Function:打印字符串中的内容
 *
 *Parameter:     S:要打印的字符串
 *
 *Return Value:成功返回0,失败返回-1
 *
 *Author:Abel Lee
 *
 *Log:2011-9-15
 ***************************************************************************************************/
void StringPrint(SString S)
{
    printf("%s\n",(char *)(S+1));
    return;
} 

/****************************************************************************************************
 *Function Name: StringLength
 *
 *Function:获取字符串长度
 *
 *Parameter:     S:求长字符串
 *
 *Return Value: 字符串长度
 *
 *Author:Abel Lee
 *
 *Log:2011-9-16
 ***************************************************************************************************/
int StringLength(SString S)
{
    return S[0];
} 

/****************************************************************************************************
 *Function Name: StringDestroy
 *
 *Function: 字符串销毁
 *
 *Parameter:     S:要销毁的字符串
 *
 *Return Value: 成功返回0,失败返回-1
 *
 *Author:Abel Lee
 *
 *Log:2011-9-16
 ***************************************************************************************************/
int StringDestroy(SString *S)
{
    int i = 0; 

    if(S == NULL)
    {
        return -1;
    } 

    while((*S)[i])
    {
        (*S)[i] = ‘\0‘;
        i++;
    }
    return 0;
}

原文地址:http://blog.51cto.com/14207158/2352640

时间: 2024-10-09 23:03:23

定长串操作的相关文章

探究一种定长队列操作(C语言版本)

一 问题来源:南京烽火通信面试 二 问题: 现有一种定长队列,长度为2的n次方,此队列可被多线程访问,但必须确保线程级安全,即在任意时刻,队列的长度保持不变. 三 笔者分析 1. 队列的存储结构--链式和顺序均可. 2. 长度为2的n次方--便于移动队头和队尾指针,假设队列长度为size,那么rear = (rear + 1) & (size - 1),&运算比算术求模运算效率高.为此,笔者使用了顺序队列. 3. 怎么确保线程级安全 笔者认为此系统一定同时存在多个读者和写者,读者是读取队头

C语言实现数据结构串(定长顺序存储表示法)

-------------------------------------------- 定长顺序存储表示法 -------------------------------------------- 存储结构: 使用字符串数组作为存储,定义字符串数组长度为MAXSTRLEN+1(0位置用来存放字符串长度) -------------------------------------------- 操作方法: 字符串赋值 通过将控制台输入的字符串赋值给串S1(从1开始存储),如果字符串长度超过限制,

“串”的定长顺序存储表示的实现

串--数据结构的实现--定长存储顺序. //头文件sstring.h #pragma once #include<iostream> using namespace std; #define STRING_SIZE 20 typedef char Sstring[STRING_SIZE+1]; int length(Sstring S) { return strlen(S); } void StrAssign(Sstring T, char *str) { int i=0; while(*st

串的定长顺序存储表示

串的定长顺序存储表示是一种类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列. 在实现时主要实现以下功能: int Length(SString s);                               //串长 bool StringConcat(SString T, SString s1, SString s2);//用T返回s1和s2连接的串 void PrintString(char T[]);                          //输出 b

快学Scala 第三课 (定长数组,变长数组, 数组循环, 数组转换, 数组常用操作)

定长数组定义: val ar = new Array[Int](10) val arr = Array("aa", "bb") 定长数组赋值: arr(0) = "cc" 变长数组定义: val ab = new ArrayBuffer[String]() val ab1 = ArrayBuffer[String]() 定长数组增加元素: ab += "aa" ab += ("bb", "cc&q

数据结构-串的定长顺序存储

串的定长顺序存储类似于线性表的顺序存储结构,用一组连续的存储单元存储串值的字符序列. 在串的定长顺序存储结构中,按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区,则可以用定长数组表示: 1 /*串定长顺序存储表示*/ 2 #define MAXSTRLEN 255 //串在MAXSTRLEN大小 3 typedef unsigned char SString[MAXSTRLEN + 1]; //所有串的0号单元存储串的长度 串的基本操做函数如下: 1 /*生成一个其值等于chars的

定长记录采用数据库读写并非最佳解决方案

对于有些应用场合如仪器仪表的采样数据,不需要对数据排序.插入和修改,只需要对数据写和读操作,在这种情况下,使用数据库来存取这样的记录数据,未必是最佳的选择,本文根据工作实践,采用文件的分块记录的方法,来处理采样这样的定长记录数据,实践证明,通过文件的分块存储方法,比数据库存储方法读写速度更快,尤其是在处理大批量的记录数据的读写的时候,这种速度上的优势更为显著.下面是分块记录的具体实现方法: 首先,假设我们的记录数据为:记录id号,电流,电压,温度,电阻,用结构体表示为: [html] view

定长内存池之BOOST::pool

内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1.              不定长内存池.典型的实现有apr_pool.obstack.优点是不需要为不同的数据类型创建不同的内存池,缺点是造成分配出的内存不能回收到池中.这是由于这种方案以session为粒度,以业务处理的层次性为设计基础. 2.             定长内存池.典型的实现有LOKI.B

定长单元的批次内存缓存池的简洁实现

问题描述: 1.内存管理计算机编程中一个基本问题,其目的在于: 1)一次可分配多个单元块,缓存维护,以改善反复的小对象申请的性能开销: 2) 管理以分配的内存,有效减少碎片的产生: 3) 保证软件使用的内存透明,了解峰值,了解使用情况,便于优化查错: 2.常用的内存管理机制有以下: 1) 变长块,依靠链表维护,一个节点一块申请了的内存,内存块大小不等,等接到一个申请时,先查维护的链表,若有可从链表取出.这种方法有很多缺点:1,当申请的内存块要遍历链表节点找到大小合适的块,最坏情况下需要把链表所有