串及其功能的实现

#ifndef _STRING_H_
#endif  _STRING_H_
//#pragma once

#include<iostream>
using namespace std;

#define MAX_STRING_SIZE 8

typedef char SString[MAX_STRING_SIZE+1]; 

int Length(SString s)
{
	return strlen(s);
}

int Index1(char *T, char *P)
{
	int t_length = strlen(T);
	int p_length = strlen(P);
	for(int i=0; i<=t_length-p_length;++i)
	{
		for(int j=0; j<p_length;++j)
		{
			if(T[i+j] != P[j])
			{
				break;
			}
		}

		if(j == p_length)
		{
			return i;
		}
		j = 0;
	}
	return -1;
}

bool StringConcat(SString T, SString s1, SString s2)
{
	int t_length = MAX_STRING_SIZE;
	int s1_length = Length(s1);
	int s2_length = Length(s2);

	if(t_length >= s1_length+s2_length)
	{
		for(int i=0; i<s1_length; ++i)
		{
			T[i] = s1[i];
		}
		for(int j=0; j<s2_length; ++j)
		{
			T[i+j] = s2[j];
		}
		T[i+j] = '\0';
		return true;
	}
	else if(t_length>s1_length && t_length<s1_length+s2_length)
	{
		for(int i=0; i<s1_length; ++i)
		{
			T[i] = s1[i];
		}
		for(int j=0; j<t_length-s1_length; ++j)
		{
			T[i+j] = s2[j];
		}
		T[i+j] = '\0';
		return false;

	}
	else if(t_length < s1_length)
	{

	}
	return true;
}

/* 若S为空串,则返回true,否则返回false */
bool StrEmpty(SString S)
{
    if (S[0] == NULL)
        return true;
    else
        return false;
}  

/*  初始条件: 串S和T存在 */
/*  操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 */
int StrCompare(SString S, SString T) //StrCompare(S,T)比较
{
    int i;
    for (i = 1; i <= S[0] && i <= T[0]; ++i)
        if (S[i] != T[i])
		{
			return S[i] - T[i];
		}
    return S[0] - T[0]; //
}
 /* 生成一个其值等于chars的串T */
bool StrAssign(SString T, char *chars)
{
    int i;
    if (strlen(chars) > MAX_STRING_SIZE)
        return false;
    else {
        T[0] = strlen(chars);
        for (i = 1; i <= T[0]; i++)
            T[i] = *(chars + i - 1);
        return true;
    }
}  

/* 由串S复制得串T */
bool StrCopy(SString T, SString S)
{
    int i;
    for (i = 0; i <= S[0]; i++)
        T[i] = S[i];
    return true;
}
/* 返回串的元素个数 */
int StrLength(SString S)
{
    return S[0];
}
/* 初始条件:串S存在。操作结果:将S清为空串 */
bool ClearString(SString S)
{
    S[0] = 0;/*  令串长为零 */
    return true;
}  

/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
bool Concat(SString T, SString S1, SString S2)
{
    int i;
    if (S1[0] + S2[0] <= MAX_STRING_SIZE)
	{ /*  未截断 */
        for (i = 1; i <= S1[0]; i++)
            T[i] = S1[i];
        for (i = 1; i <= S2[0]; i++)
            T[S1[0] + i] = S2[i];
        T[0] = S1[0] + S2[0];
        return true;
    }
	else
	{ /*  截断S2 */
        for (i = 1; i <= S1[0]; i++)
            T[i] = S1[i];
        for (i = 1; i <= MAX_STRING_SIZE - S1[0]; i++)
            T[S1[0] + i] = S2[i];
        T[0] = MAX_STRING_SIZE;
        return false;
    }
}
 /* 用Sub返回串S的第pos个字符起长度为len的子串。 */
bool SubString(SString Sub, SString S, int pos, int len)
{
    int i;
    if (pos < 1 || pos > S[0] || len < 0 || len > S[0] - pos + 1)
        return false;
    for (i = 1; i <= len; i++)
        Sub[i] = S[pos + i - 1];
    Sub[0] = len;
    return true;
} 

/*  初始条件: 串S和T存在,1≤pos≤StrLength(S)+1 */
/*  操作结果: 在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSE */
bool StrInsert(SString S, int pos, SString T)
{
    int i;
    if (pos < 1 || pos > S[0] + 1)
        return false;
    if (S[0] + T[0] <= MAX_STRING_SIZE)
	{ /*  完全插入 */
        for (i = S[0]; i >= pos; i--)
            S[i + T[0]] = S[i];
        for (i = pos; i < pos + T[0]; i++)
            S[i] = T[i - pos + 1];
        S[0] = S[0] + T[0];
        return true;
    }
	else
	{ /*  部分插入 */
        for (i = MAX_STRING_SIZE; i <= pos; i--)
            S[i] = S[i - T[0]];
        for (i = pos; i < pos + T[0]; i++)
            S[i] = T[i - pos + 1];
        S[0] = MAX_STRING_SIZE;
        return false;
    }
}  

/*  初始条件: 串S存在,1≤pos≤StrLength(S)-len+1 */
/*  操作结果: 从串S中删除第pos个字符起长度为len的子串 */
bool StrDelete(SString S, int pos, int len)
{
    int i;
    if (pos < 1 || pos > S[0] - len + 1 || len < 0)
        return false;
    for (i = pos + len; i <= S[0]; i++)
        S[i - len] = S[i];
    S[0] -= len;
    return true;
}

 /* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
/* 其中,T非空,1≤pos≤StrLength(S)。 */
/* 蛮力法*/
int Index(SString S, SString T, int pos)
{
    int i = pos; /* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */
    int j = 1; /* j用于子串T中当前位置下标值 */
    while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
    {
        if (S[i] == T[j]) /* 两字母相等则继续 */
        {
            ++i;
            ++j;
        } else /* 指针后退重新开始匹配 */
        {
            i = i - j + 2; /* i退回到上次匹配首位的下一位 */
            j = 1; /* j退回到子串T的首位 */
        }
    }
    if (j > T[0])
        return i - T[0];
    else
        return 0;
}
/*  初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */
/*  操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */
bool Replace(SString S, SString T, SString V)
{
    int i = 1; /*  从串S的第一个字符起查找串T */
    if (StrEmpty(T)) /*  T是空串 */
        return false;
    do {
        i = Index(S, T, i); /*  结果i为从上一个i之后找到的子串T的位置 */
        if (i) /*  串S中存在串T */
        {
            StrDelete(S, i, StrLength(T)); /*  删除该串T */
            StrInsert(S, i, V); /*  在原串T的位置插入串V */
            i += StrLength(V); /*  在插入的串V后面继续查找串T */
        }
    } while (i);
    return true;
} 

/*  初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */
/*  操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */
bool StrReplace(SString S, SString T, SString V) {
    int i = 1; /*  从串S的第一个字符起查找串T */
    if (StrEmpty(T)) /*  T是空串 */
        return false;
    do {
        i = Index(S, T, i); /*  结果i为从上一个i之后找到的子串T的位置 */
        if (i) /*  串S中存在串T */
        {
            StrDelete(S, i, StrLength(T)); /*  删除该串T */
            StrInsert(S, i, V); /*  在原串T的位置插入串V */
            i += StrLength(V); /*  在插入的串V后面继续查找串T */
        }
    } while (i);
    return true;
}
#include"String.h"

void main()
{
	char *T = "abbaba";
	char *P = "abc";

	int index = Index1(T,P);
	cout<<"index = "<<index<<endl;
	cout<<StrCompare( T,P)<<endl;
	//cout<<StrEmpty(T)<<endl;//空为1;非空为0
}

时间: 2024-10-14 17:58:10

串及其功能的实现的相关文章

C语言:自定义一个查找字串的功能函数,类似于&lt;string.h&gt;中的strstr()

//自定义一个字符串字串查找标准库函数strstr() #include<stdio.h> #include<string.h> char* myStrstr(char *str1,char *str2); int main() { char *str1 = "hello worl world ld"; char *str2 = " world "; puts(myStrstr(str1,str2)); return 0; } char *m

Linux more(功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上)

more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 .more命令从前向后读取文件,因此在启动时就加载整个文件. 1.命令格式: more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ] 2.命令功能: more命令和cat的功能一样都

Win10装哪个版本好用?Win10七大版本详解及主要区别

Win10装哪个版本好用?对很多用户来说都不是很清楚,下面小编为大家介绍Win10七大版本详解及主要区别,有需要的朋友可以过来参考一下,希望能对大家有所帮助 微软备受期待的下一代操作系统--Windows 10--即将正式推出.该操作系统反映了软件巨人对未来所做出的种种改变和看法.例如,公司借由"通用应用平台"实施的"大一统"战略.那么Win10装哪个版本好用?下面小编就为大家介绍Win10七大版本详解及主要区别,一起来看看吧! 届时,所有设备都将运行于统一的系统核

Centos Linux 常用shell操作命令

文件处理命令:ls 功能描述:显示目录文件 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 语法: ls 选项[-ald]  [文件或目录] -a 显示所有文件,包括隐藏文件 -l 详细信息显示 -d 查看目录属性 $ ls –a > dir.txt //将ls –a命令执行结果输出到dir.txt文件. $ ls –a >> dir.txt //将ls –a命令执行结果附加到dir.txt文件之后. 文件处理命令:cd 功能描述:切换目录 命令英文原意:cha

linux中more命令如何使用

     more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上.兄弟连Linux培训教程(www.lampbrother.net) more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 .more命令从前向后读取文件,因此在启动时就加载整个文件. 1.命令格式: more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum

linux常用管理命令使用

1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. 常用的命令:ls, cd, pwd, mkdir, cp, rm, mv, touch, cat, more, less, head, tail, du, wc ls: -A :列出当前目录全部的文件,连同隐藏档,但不包括 . 与 .. 这两个目录 -d :仅列出目录本身,而不是列出目录内的文件数据  -h :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来  -i :列出 inode 号码,inode 

每天一个linux命令(12):more命令

1.命令简介 more (more) 该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比,方便逐页阅读(file perusal filter for crt viewing) .more名单中内置了若干快捷键,按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中按h可以查看说明文件 . 2.用法 more [-dlfpcsu] [-num] [+/pattern] [+

Xcode及obj-c的基础知识

1, 从简单的例程来看基本语法: 下面的代码是通过OSX-Application-Command Line Tool生成的: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); NSLog(@"Hello, Objective-c&q

Linux学习之more命令

more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 ,more命令从前向后读取文件,因此在启动时就加载整个文件. 1.命令格式: more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ] 2.命令功能: more命令和cat的功能一样都