• “串”学习——三种表示方法


    串有三种表示方法:

    image

    str.h

    #ifndef _STR_H
    #define _STR_H
    #define MAXSTRING 255
    
    typedef unsigned char STR[MAXSTRING+1];
    
    
    void NewStr(STR &s,char *str);
    
    void ClearStr(STR &s);
    
    int StrCompare(STR s,STR t);
    
    int StrConcat(STR &s,STR t);
    
    int SubStr(STR &s,STR t,int pos,int len);
    
    #endif

    str.cpp

    #include<stdio.h>
    #include<stdlib.h>
    #include"str.h"
    
    void NewStr(STR &s,char *str)
    {
    	int i;
    	if(str == NULL)
    		return;
    	for(i=0; str[i]; i++)
    		s[i] = str[i];
    	s[i] = 0;
    }
    
    
    void ClearStr(STR &s)
    {
    	s[0] = 0;
    }
    
    int StrCompare(STR s,STR t)
    {
    	int i;
    	for(i=0; s[i] && t[i] ;i++)
    		if(s[i] != t[i])
    			return s[i] - t[i];
    	if(s[i])
    		return 1;
    	else if(t[i])
    		return -1;
    	else 
    		return 0;
    }
    
    int StrConcat(STR &s,STR t)
    {
    	int i,j;
    	for(i=0; s[i] ;i++);
    	for(j=0; t[j] && i<= MAXSTRING ;i++,j++)
    		s[i] = t[j];
    	if(i>MAXSTRING && t[j])
    	{
    		ClearStr(s);
    		return 0;
    	}
    	s[i] = 0;
    }
    
    int SubStr(STR &s,STR t,int pos,int len)
    {
    	int i,j;
    	for(i=0; i<pos -1; i++)
    		if(!t[i]) return 0;
    	for(j=0; j<len && t[i] ;i++,j++)
    		s[j] = t[i];
    	if(j!=len)
    	{
    		ClearStr(s);
    		return 0;
    	}else{
    		s[j] = 0;
    		return 1;
    	}
    }

    testString.cpp

    #include<stdio.h>
    #include "str.h"
    
    void main()
    {
    	int res;
    	STR t,s;
    	NewStr(s,"hello");
    	printf("s=%s\n",s);
    	NewStr(t,"hello");
    	res = StrCompare(s,t);
    	if(res == 0)
    		printf("s==t\n");
    	else if(res > 0)
    		printf("s > t\n");
    	else 
    		printf("s < t\n");
    	NewStr(t," world");
    	StrConcat(s,t);
    	printf("s=%s\n",s);
    	ClearStr(t);
    
    	SubStr(t,s,2,6);
    	printf("t=%s\n",t);
    	ClearStr(s);
    }

    image

    str.h

    #ifndef _STR_H
    #define _STR_H
    
    typedef struct
    {
    	char *ch;
    	int len;
    }STR;
    
    
    STR *NewStr(char *str);
    
    void DestroyStr(STR *s);
    
    void ClearStr(STR *s);
    
    int StrCompare(STR *s,STR *t);
    
    int StrConcat(STR *s,STR *t);
    
    STR * SubStr(STR *s,int pos,int len);
    
    #endif

    str.c

    #include<stdio.h>
    #include<stdlib.h>
    #include"str.h"
    
    //根据char[]创建字符串
    STR *NewStr(char *str)
    {
    	STR * s = NULL;
    	int i;
    	s = (STR *)malloc(sizeof(STR));
    	if(s == NULL) return NULL;
    	//循环到str[i]==\0时结束,i就是字符串的长度
    	for(i = 0; str[i] ; ++i);
    	s->ch = (char *)malloc((i + 1) * sizeof(char));
    	if(s->ch == NULL)
    	{
    		free(s);
    		return NULL;
    	}
    	//将str中内容搬到s.ch里
    	s->len = i;
    	while(i>=0)
    	{
    		s->ch[i] = str[i];
    		--i;
    	}
    	return s;
    }
    
    void DestroyStr(STR *s)
    {
    	free(s->ch);
    	free(s);
    }
    
    void ClearStr(STR *s)
    {
    	free(s->ch);
    	s->ch = NULL;
    	s->len = 0;
    }
    
    int StrCompare(STR *s,STR *t)
    {
    	int i;
    	for(i = 0; i < s->len && i < t->len;i++)//abc abcde
    		//s->ch[i]ASCII码大则返回正数代表大于关系
    		//如果s->ch[i]比较小,则返回负数代表小于关系
    		if(s->ch[i] != t->ch[i])
    			return s->ch[i] - t->ch[i];
    	//s比t短时返回负数,比t长时返回正,一样长返回0
    	return s->len - t->len;
    }
    
    int StrConcat(STR *s,STR *t)
    {
    	//s,t都指向一块内存区,而他们合并后的内存区一定比他们大
    	char *temp = NULL;
    	int i;
    	temp = (char *)malloc((s->len + t->len +1) * sizeof(char));
    	if(temp == NULL) return 0;
    	for(i = 0;i < s->len ;i++)
    		temp[i] = s->ch[i];
    	for(; i < s->len + t->len ;i++)
    		temp[i] = t->ch[i - s->len];
    	temp[i] = 0;
    	ClearStr(s);
    	s->ch = temp;
    	s->len = i;
    	return 1;
    }
    
    STR * SubStr(STR *s,int pos,int len)
    {
    	STR * t = NULL;
    	if(pos < 1 || pos > s->len || len < 0 || len > s->len - pos)
    		return NULL;
    	t = NewStr("");
    	ClearStr(t);
    	t->ch = (char *)malloc((len + 1) * sizeof(char));
    	if(t->ch == NULL) return NULL;
    	t->len = len;
    	//把有效的len位字符搬到t里面去
    	for(--len ;len >= 0;-- len)
    		t->ch[len] = s->ch[pos - 1 + len];
    	t->ch[t->len] = 0;
    	return t;
    }

    testString.c

    #include<stdio.h>
    #include "str.h"
    
    void main()
    {
    	int res;
    	STR *t = NULL,*s = NewStr("hello");
    	printf("s=%s,len=%d\n",s->ch,s->len);
    	t = NewStr("hello");
    	res = StrCompare(s,t);
    	if(res == 0)
    		printf("s==t\n");
    	else if(res > 0)
    		printf("s > t\n");
    	else 
    		printf("s < t\n");
    	t = NewStr(" world");
    	StrConcat(s,t);
    	printf("s=%s,len=%d\n",s->ch,s->len);
    	DestroyStr(t);
    
    	t = SubStr(s,2,5);
    	printf("t=%s,len=%d\n",t->ch,t->len);
    	DestroyStr(s);
    }

    image

    str.h

    #ifndef _STR_H
    #define _STR_H
    #define CHUNKSIZE 4
    
    typedef struct Chunk
    {
    	char ch[CHUNKSIZE];
    	struct Chunk *next;
    }CHUNK;
    
    typedef struct
    {
    	CHUNK *head,*tail;
    	int curlen;
    }STR;
    
    STR *NewStr(char *str);
    
    void DestroyStr(STR *s);
    
    void ClearStr(STR *s);
    
    int StrCompare(STR *s,STR *t);
    
    int StrConcat(STR *s,STR *t);
    
    STR * SubStr(STR *s,int pos,int len);
    
    void PrintStr(STR *s);
    
    #endif

    str.c

    #include<stdio.h>
    #include<stdlib.h>
    #include"str.h"
    
    //根据char[]创建字符串
    STR *NewStr(char *str)
    {
    	int i,j;
    	CHUNK *temp;
    	STR *s = (STR *)malloc(sizeof(STR));
    	s->head = (CHUNK *)malloc(sizeof(CHUNK));
    	s->tail = s->head;
    	s->tail->next = NULL;
    	s->curlen = 1;
    	for(i=0,j=0; str[i] ;i++,j++){
    		if(j == CHUNKSIZE){
    			temp = (CHUNK *)malloc(sizeof(CHUNK));
    			temp->next = NULL;
    			s->tail->next = temp;
    			s->tail = temp;
    			s->curlen ++;
    			j=0;
    		}
    		s->tail->ch[j] = str[i];
    	}
    	if(j == CHUNKSIZE)//有用的字符占满了最后一块空间
    	{
    		temp = (CHUNK *)malloc(sizeof(CHUNK));
    		temp->next = NULL;
    		s->tail->next = temp;
    		s->tail = temp;
    		s->curlen ++;
    		j=0;
    	}
    	//填掉空白部分
    	for(;j<CHUNKSIZE;j++)
    		s->tail->ch[j] = 0;
    	return s;
    }
    
    void DestroyStr(STR *s)
    {
    	CHUNK * temp = s->head;
    	while(temp)
    	{
    		s->head = s->head->next;
    		free(temp);
    		temp = s->head;
    	}
    	free(s);
    }
    
    void ClearStr(STR *s)
    {
    	for(;s->head;s->head = s->head->next)
    		free(s->head);
    	s->head = s->tail = NULL;
    	s->curlen = 0;
    }
    
    int StrCompare(STR *s,STR *t)
    {
    	int i;
    	CHUNK *s1 = s->head,*t1 = t->head;
    	for(i = 0; s1 && t1 ;i++)
    	{
    		if(s1->ch[i] != t1->ch[i])
    			return s1->ch[i] - t1->ch[i];
    		if(i == CHUNKSIZE-1)
    		{
    			s1 = s1->next;
    			t1 = t1->next;
    			i = -1;
    		}
    	}
    	if(s1)
    		return 1;
    	else if(t1)
    		return -1;
    	else
    		return 0;
    }
    
    int StrConcat(STR *s,STR *t)
    {
    	CHUNK * temp,*s1 = s->tail,*t1 = t->head;
    	int i,j;
    	for(i=0;s1->ch[i];i++);
    	for(j=0;;i++,j++)
    	{
    		if(i == CHUNKSIZE){
    			temp = (CHUNK *)malloc(sizeof(CHUNK));
    			temp->next = NULL;
    			s1->next = temp;
    			s1 = temp;
    			s->curlen ++;
    			i=0;
    		}
    		if(j == CHUNKSIZE){
    			t1 = t1->next;
    			j=0;
    		}
    		if(t1->ch[j])
    			s1->ch[i] = t1->ch[j];
    		else
    			break;
    	}
    	if(i == CHUNKSIZE)//有用的字符占满了最后一块空间
    	{
    		temp = (CHUNK *)malloc(sizeof(CHUNK));
    		temp->next = NULL;
    		s1->next = temp;
    		s1 = temp;
    		s->curlen ++;
    		i=0;
    	}
    	//填掉空白部分
    	for(;i<CHUNKSIZE;i++)
    		s1->ch[i] = 0;
    	return 1;
    }
    
    STR * SubStr(STR *s,int pos,int len)
    {
    	int i,j,k;
    	CHUNK * s1 = s->head,*temp;
    	STR * t = (STR *)malloc(sizeof(STR));
    	t->head = (CHUNK *)malloc(sizeof(CHUNK));
    	t->tail = t->head;
    	t->tail->next = NULL;
    	t->curlen = 1;
    	for(i=0,j=0; s1 && i < pos - 1;i++,j++)
    	{
    		if(j == CHUNKSIZE - 1)
    		{
    			s1 = s1->next;
    			j = -1;
    		}
    	}
    	if(!s1)return 0;
    	for(k = 0; s1 && i<pos - 1 + len ;i++,j++,k++)
    	{
    		if(k == CHUNKSIZE){
    			temp = (CHUNK *)malloc(sizeof(CHUNK));
    			temp->next = NULL;
    			t->tail->next = temp;
    			t->tail = temp;
    			t->curlen ++;
    			k=0;
    		}
    
    		t->tail->ch[k] = s1->ch[j];
    
    		if(j == CHUNKSIZE - 1)
    		{
    			s1 = s1->next;
    			j = -1;
    		}
    	}
    	if(k == CHUNKSIZE)//有用的字符占满了最后一块空间
    	{
    		temp = (CHUNK *)malloc(sizeof(CHUNK));
    		temp->next = NULL;
    		t->tail->next = temp;
    		t->tail = temp;
    		t->curlen ++;
    		k=0;
    	}
    	//填掉空白部分
    	for(;k<CHUNKSIZE;k++)
    		t->tail->ch[k] = 0;
    	return t;
    }
    
    void PrintStr(STR *s)
    {
    	int i;
    	CHUNK * temp = s->head;
    	for(i=0; temp ;i++)
    	{
    		if(temp->ch[i])
    			printf("%c",temp->ch[i]);
    		else
    			break;
    		if(i == CHUNKSIZE - 1)
    		{
    			temp = temp->next;
    			i = -1;
    		}
    	}
    	printf("\n");
    }

    testString.c

    #include<stdio.h>
    #include "str.h"
    
    void main()
    {
    	int res;
    	STR *t = NULL,*s = NewStr("hello");
    	PrintStr(s);
    	t = NewStr("hello");
    	res = StrCompare(s,t);
    	if(res == 0)
    		printf("s==t\n");
    	else if(res > 0)
    		printf("s > t\n");
    	else 
    		printf("s < t\n");
    	t = NewStr(" world");
    	StrConcat(s,t);
    	PrintStr(s);
    	DestroyStr(t);
    
    	t = SubStr(s,2,6);
    	PrintStr(t);
    	DestroyStr(s);
    }
  • 相关阅读:
    洛谷——P2054 [AHOI2005]洗牌(扩展欧几里得,逆元)
    线性筛法(伪模板及。。。)
    洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)
    CF450B Jzzhu and Sequences(矩阵加速)
    洛谷——P1349 广义斐波那契数列(矩阵加速)
    P1269 信号放大器
    istio prometheus预警Prometheus AlertManager
    istio promethus收集不到数据
    KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
    centos7虚拟机设置静态ip
  • 原文地址:https://www.cnblogs.com/shenerguang/p/2335955.html
Copyright © 2020-2023  润新知