Skip to content
c

#define  TRUE         1
#define  FALSE        0
#define  OK           1
#define  ERROR        0
#define  IBFEASIBLE  -1
#define  OVERFLOW    -2  
typedef  int   Status;

#define  errInt   -999
#define  MAXSTRLEN  254

// 串的定长顺序表示
//typedef  unsigned char  SStr[MAXSTRLEN+1];  // 0 单元存放串的长度
typedef  unsigned char  *SStr;  // 串长<=255,0号单元存放串的长度,需动态分配空间

typedef SStr  String;
SStr errStr;

int random1i(int x) {  
   if (x<0) return 0;
   else return (int)rand() % x;
}

int random2i(int x, int y) { // 返回一个值大于等于x, 小于y 的非负随机数,
   if (x>=y) return x;
   else return (int)rand() % (y-x) + x;
}

String StrFree(String S) {
   if (S) free(S);   
   return NULL;
}

String allocStr(int len) {  
   String S;
   if (len>MAXSTRLEN) len = MAXSTRLEN;   
   if (!(S = (String)calloc(len+2, sizeof(char)))) exit(OVERFLOW);
   S[0] = len;   
   return S;
}

String StrNew(char *cs) {  // 返回由C串cs构造的短串
   int cslen;   char *c;
   for (cslen=0, c=cs; *c++; ++cslen);         // 求cs的长度i
   String S = allocStr(cslen);                  // 按cs长度分配存储空间
   memcpy(S+1, cs, (int)S[0]);                 // 复制cs前cslen个字符为串值
   S[1+S[0]] = '\0';   return S;               // 置结束符,返回S
}


String StrAssign(String S, int pos, char *cs) {
   
   int len, newlen, oldlen;   char *c;
   if (!S || pos<1 || pos>1+S[0]) return S;    
   for (len=0, c=cs; *c++; ++len);             
   if (0==len) return S;                       
   if ((newlen = pos+len-1) > S[0]) {          
      if (newlen>MAXSTRLEN) newlen = MAXSTRLEN;    
      S[0] = newlen;    len = newlen - pos +1;      
      if (!(S = (String)realloc(S, (newlen+2)*sizeof(char)))) exit(OVERFLOW); 
      S[newlen+1] = '\0';                    
   } 
   memcpy(S+pos, cs, len);                  
   return S;                                  
} 
                          
String StrCopy(String S) {       
   if (!S) return NULL;       
   String T;
   if (!(T = (String)malloc((2+S[0])*sizeof(char)))) exit(OVERFLOW);      
      memcpy(T, S, 2+S[0]);                     
   return T;
}

String CreateRandomStr(int length) {
   String S;
   int len = random2i(length/2, length);
   if (!(S = (String)malloc((len+2)*sizeof(char)))) exit(OVERFLOW);
   S[0] = len;
   for (int i=1; i<=len; i++) S[i] = 'A'+random1i(26); 
   S[len+1] = '\0';   return S;        
}

int StrLen(String S) {
   if (S) return S[0];
   else return 0;        
}   

int StrCmp1(String S, String T) {
   if (!S || !T) return errInt;                 
   for (int i=1; i<=S[0]; i++)                  
      if (S[i] != T[i]) return (int)S[i]-T[i];
   return 0;
}


int StrCmp(String S, String T) {  
   if (!S || !T) return errInt;                
   for (S++, T++; *S && *S == *T; S++, T++);   
   return (int)*S-*T;                          
}      

String StrConcat(String S1, String S2) {     
   String T;  int i;
   if (!S1 || !S2) return  NULL;                     
   if (S1[0]+S2[0] <= MAXSTRLEN) {                   
      T = allocStr(S1[0]+S2[0]);                      
      //for (i=1; i<=S1[0]; i++) T[i] = S1[i];          
      memmove(T+1, S1+1, (int)S1[0]);                  
      //for (i=1; i<=S2[0]; i++) T[i+S1[0]] = S2[i];    
      memmove(T+(int)S1[0]+1, S2+1, (int)S2[0]);        
      T[0] = S1[0]+S2[0];
   } else if (S1[0] < MAXSTRLEN) {                    
      T = allocStr(MAXSTRLEN);
      //for (i=1; i<=S1[0]; i++) T[i] = S1[i];
      memmove(T+1, S1+1, (int)S1[0]);             
      //for (i=S1[0]+1; i<=MAXSTRLEN; i++) T[i] = S2[i-S1[0]];
      memmove(T+(int)S1[0]+1, S2+1, MAXSTRLEN-S1[0]);             
      T[0] = MAXSTRLEN;
   } else {                                           
      T = allocStr(MAXSTRLEN);
      //for (i=0; i<=MAXSTRLEN; i++) T[i] = S1[i];
      memmove(T, S1, (int)S1[0]+1);             
   }
   T[T[0]+1] = '\0';   return T;
} 

String StrSub(String S, int pos, int len) { 
   if (!S || pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)
      return NULL;
   String Sub = allocStr(len);
   //for (int i=1; i<=len; i++) Sub[i] = S[pos+i-1];
   memcpy(Sub+1, S+pos, len);             
   Sub[0] = len;   Sub[len+1] = '\0';
   return Sub;
}

Status StrRange(String S, int a, int b) { 
   if (!S || a<1 || a>b || b>S[0]) return ERROR;  
   S[0] = b-a+1;                                  
   memcpy(S+1, S+a, (int)S[0]);                
   S[1+S[0]] = '\0';                            
   return OK;
}

int Index(String S, String T, int pos) {  
    
    int i = pos, j = 1;
    while (i <= S[0] && j <= T[0])
        if (S[i] == T[j]) { ++i;   ++j; }   
        else { i = i-j+2;   j = 1; }       
    if (j > T[0]) return  i-T[0];
    else return 0;
}
void StrPrintf(String S) {   
  printf("\"%s\"\n", &S[1]);
}

持之苟有恒,久久自芬芳