您的位置:首页 > 编程语言 > C语言/C++

动态串及其基本操作(C语言实现)

2008-12-23 20:27 423 查看
BCPL  BasicCombinedProgammingLanguage即C语言实现

动态串及基本操作实现

#include <stdlib.h>
#include <stdio.h>

typedef struct{
    char* ch;
    int length;
}HString;

//赋值
int strAssign(HString *s, char* chars){
    int len=0,i;
    if(s->ch != NULL)
    free(s->ch); //释放原有空间
    while(chars[len] != '/0'){ 
        len++;//求得char数组的长度
    }
    if(!len){//空串
        s->ch = NULL;
        s->length = 0;
    }
    else{
        s->ch = (char*)malloc(len * sizeof(char));
        if(!s->ch)
        exit(-1);
        for(i=0;i<len;i++){
            s->ch[i] = chars[i];
            s->length = len;
        }       
    }
    return 1;


 

//clear string
int clearString(HString *s){
    if(s->ch)
    free(s->ch);
    s->ch = NULL;
    s->length = 0;
    return 1;
}

//get the length
int strLength(HString s){
    return s.length;
}

//compare
int strCmp(HString s,HString t){
    int i;
    for(i=0;i<s.length && i<t.length;i++){
        if(s.ch[i] != t.ch[i])
        return (s.ch[i]-t.ch[i]);
    }
    return (s.length-t.length);
}

//insert string t
int strInsert(HString* s, int pos, HString t){
    int i;
    if(pos<1 || pos>(s->length+1))
    return -1;
    if(t.length){
        s->ch = (char*)realloc(s->ch,(s->length + t.length) * sizeof(char));
        if(!s->ch)
        exit(-1);
  //后移pos之后的所有元素
  for(i=s->length-1; i>=pos; i--){
   s->ch[t.length + i] = s->ch[i];
  }
  //将t中所有元素插入s中
  for(i=0;i<t.length;i++){
   s->ch[pos+i] = t.ch[i];
  }
  s->length += t.length;
  s->ch[s->length] = '/0';
    }
    return 1;
}

 

//cpy
int strCpy(HString *s,HString t){
    int i;
    if(s->ch)
    free(s->ch);
    s->ch = (char* )malloc(t.length * sizeof(char));
    if(!s->ch)
    exit(-1);
    for(i=0; i<t.length; i++){
        s->ch[i] = t.ch[i];
    }
    s->length = t.length;
    return 1;
}

//catenate string
int strCat(HString *s,HString t1,HString t2){
    int i;
    if(s->ch)
    free(s->ch);
    s->ch = (char* )malloc((t1.length + t2.length) * sizeof(char));
    if(!s->ch)
    exit(-1);
    s->length = t1.length + t2.length;
   
    for(i=0; i<t1.length; i++){
        s->ch[i] = t1.ch[i];
    }
    for(i=0; i<t2.length; i++){
        s->ch[t1.length + i] = t2.ch[i];
    }
    return 1;
}

//get the substring
int substring(HString *s,HString t,int pos, int len){
    int i;
    if(pos < 1 || pos > t.length+1 || len<0 || len > (t.length-pos+1) ){
        return 0;
    }
    if(s->ch)
    free(s->ch);
    if(!len){
        s->ch = NULL;
        s->length = 0;
    }
    else
    {
        s->ch = (char* )malloc(len * sizeof(char));
        if(!s->ch)
        exit(-1);
        for(i=0; i<len; i++){
            s->ch[i] = t.ch[pos+i-1];
            s->length = len;
        }
    }
    return 1;
}               

//print the string
void strPrint(HString s){
    int i;
    if(!s.length){
        printf("the string is empty!/n");
    }
    else
    {
        for(i=0; i<s.length; i++){
            printf("%c",s.ch[i]);
        }
        printf("/n");   
    }
}                                                                                 

 

#include "string_1.h"
HString s,t,s1,s2;
main(){
    char str1[] = "String operate function!";
    char str2[] = "basic ";
    int len,cmp;
    //初始化,赋值
    strAssign(&s,str1);
    strAssign(&t,str2);
    //length
    len = strLength(s);
    printf("the length of string s is %d/n",len);
    //display the string s and t
    printf("string s:");
    strPrint(s);
    printf("string t:");
    strPrint(t);
   
    //compare
    cmp = strCmp(s,t);
    if(cmp > 0){
        printf("/ns is larger than t/n");
    }
    else if(cmp < 0){
        printf("/nt is larger than s/n");
    }
    else{
        printf("/nequal/n");
    }
   
    //insert
    strInsert(&s,7,t);
    printf("after insert (t to s) at the 7: ");
    strPrint(s);
   
    //copy
    strCpy(&s,t);
    printf("after copied: /nstring s:");
    strPrint(s);
   
    //catenate
    strCat(&s1,s,t);
    printf("/nafter catenate(t to s):");
    strPrint(s1);
    printf("/nNow the string s is :");
    strPrint(s);
   
    //substring
    substring(&s2,s,1,4);
    printf("/nsubstring from s:/n");
    strPrint(s2);         
    getchar();
}   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  语言 c string null insert basic