字串(C/C++)

fwpevil發表於2018-01-27

在書本上看到的關於字串的一些演算法

#include <stdio.h>

#include <string.h>
#include <assert.h>
#include <malloc.h>
#define MAXLEN 100
#define N 80
//my_strlen
//計算字串的長度函式的實現
int my_strlen(char *str)
{
 int i=0;
 char *pstr = 0;
 pstr = str;
 while(pstr[i])
 {
  i++;
 }
 return i;
}
//strcpy
//字串的拷
void my_strcpy(char *des,char *scr)
{
 assert(des!=NULL&&scr!=NULL);
 while(*scr)
 {
  *des++=*scr++;
 }
 *des='\0';
}
//isalpha
//判斷字元是否為字母函式的實現
int my_isalpha(int c)
{
 if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
 {
  return 1;
 }
 else
  return 0;
}
//isdigit
//判斷字元是否為數字函式的實現
int my_isdigit(int c)
{
 if(c>='0'&&c<='9')
 {
  return 1;
 }
 else
  return 0;
}
//islower
//判斷字元是否為小寫字母函式的實現
int my_islower(int c)
{
 if(c>='a'&&c<='z')
 {
  return 1;
 }
 else
  return 0;
}
//tolower
//判斷字元是否為大寫字母函式的實現
char my_tolower(int c)
{
 if(c>='A'&& c<='Z')
 {
  c=c-32+'A'-1;
  return c;
 }
 else
 {
  return c;
 }
}
//toupper
//將小寫字母轉化大寫字母
char my_toupper(int c)
{
 //判斷字元是否為字母
 if(c>='A'&&c<='z')
 {
  //判斷字元是否為小寫字母
  if(c>='a'&&c<='z')
  {
   //將小寫字母轉化大寫字母
   c=c-'a'+32;
   return c;
  }
  else
  {
   return c;
  }
 }
 else
 {
  return c;
 }
}
//strchar
//在字串中查詢某個字元
char *my_strchr(char *str,int c)
{
 while((*str!=c)&&(*str))
 {
  str++;
 }
 return (str);
}
//strcmp
//比較字串大小函式的實現
int my_strcmp(char *s1,char *s2)
{
 int diffent = 0; 
  
 while(1){
  if(*s1 == '\0' && *s2 == '\0'){
   diffent = 0;
   break;
  }
    
   diffent = *s1 - *s2;
  if(diffent){
   break;
  }
      
  s1++;
  s2++;  
 } 
 
 return diffent;
}
//strcat
//字串的連線函式的實現
char *my_strcat(char *target,const char *source) 
{  
  char *original=target; 
  while(*original != '\0') 
   original++;     // Find the end of the string 
  while(*source != '0')
   *original++=*source++; 
  *original='\0';
  return(target); 

//chrcnt
//計算某個字元在字串出現的次數函式的實現
int my_chrcnt(char *sour,int letter)
{
 int count=0;
 while(*sour)
 {
  
  if(*sour==letter)
   count++;
  sour++;
 }
 return count;

}

//字串刪除演算法
int my_del(char str1[],int i,int j,char str2[])
{
 int m,k,p=0;
 char *str = 0;
 m=strlen(str1);
 memset(str2,0,sizeof(str2));
 if(i+j>m)
  return 0;
 if (i >=j )
  return 0;
 str = str1;
 
 for(k=0;k<i-1;k++)
  str2[p++]=str[k];
 printf("1:%s\n",str2);
 for(k=i+j-1;k<m+1;k++)
  str2[p++]=str1[k];
 printf("2:%s\n",str2);
 str2[p]='\0';
 return 1;
}
//取子串演算法
int get_subs(char str1[],int i,int j,char str2[])
{
 int m,k,p=0;
 m=strlen(str1);
 memset(str2,0,sizeof(str2));
 if(i+j>m)
  return 0;
 for(k=0;k<j;k++)
  str2[p++]=str1[i-1+k];
 str2[p]='\0';
 return 1;
}
//字串查詢演算法
int my_search(char *str1,char *substr)
{
 char *p,*r;
 int n=0;
 char *str = str1;
 
 while(*str)
 {
  p=str;     //P指向父串
  r=substr;   //R指向子串
  while(*r)   //若子串不為空
  {
   if(*r==*p)  
   {
    r++;
    p++;
   }
   else
    break;
  }
  if(*r=='\0')
  {
   n++;
   //return str;
  }
  str++;
 }
 //if n = 0;
 return n;
}
//刪除指定子串演算法
char  *my_delsub(char *str,char *sub)
{
 char *p,*str2;
 char *t;
 int i=0;
 t=(char *)malloc(strlen(str));
 str2=str;
 p=sub;
 while(*str2)
 {
  while(*p)
  {
   if(*p==*str2)
     break;
     p++;
   
  }
  if(*p=='\0')
  {
   t[i]=*str2;
   i++;
  }
  str2++;
  p=sub;
 }
 t[i]='\0';
 str=t;
 return str;
}
//字串替換演算法
char  *my_replace(char *src,char *s1,char *s2)
{
 char *p;
 char *r;
 char *dstsrc =0;
 int srclen =0;
 
 char *str1 = src;
 srclen = strlen(src);
 while(*src)
 {
  p=str1;
  r=s1;
  while(*r)
  {
   if(*p==*r)
   {
    r++;
    p++;
   }
  else
   break;
  }
  if(*r=='\0')
  {
  
   break;
  }
  str1++;
 }
 if (str1 >= src +strlen(s2) -1)
  return 0;
 dstsrc = (char *)malloc(srclen + strlen(s2) -strlen(s1) + 1);
 memset(dstsrc,0,srclen + strlen(s2) -strlen(s1) + 1);
 p = src;
 r = dstsrc;
 while(p < str1)
 {
  *r++ = *p++;
 }
 int i;
 //替換字元
 for(i = 0;i<strlen(s2);i++)
  *r++=s2[i];
 p = str1 + strlen(s1);
 while(*p)
 {
  *r++ = *p++;
 }
 memset(src,0,srclen);
 strcpy(src,dstsrc);
 free(dstsrc);
 return src; 
}
char *huiwen(char *str)
{
 char *p1,*p2;
 int i,t=0;
 p1=str;
 p2=strlen(str)-1+str;
 for(i=0;i<strlen(str)/2;i++)
  if(*p1++!=*p2--)
    {
    t=1;
    break;
   }
  if(t==0)
   return ("yes,this string is huiwen.");
  else
   return ("no,this string is not huiwen.");
}
//把一個字串中的字元(字母)按從小到大排序,並把這個全部
//由字母組成的字串儲存在原串中,函式返回這個字串的長度
int fun(char *str)
{
 char *p;
 int j=0,k=0,m=0;
 int i=0;
 char t;
 p=str;
 //先統計字母,並把它放在STR中
 while(*p)
 {
  if((*p>='A'&&*p<='Z')||(*p>='a'&&*p<='z'))
   *(str+i++)=*p;
   p++;
 }
 *(str+i)='\0';
 p=str;
 //排序
 while(*(p+j))
 {
  k=j;
  m=j;
  while(*(p+k))
  {
   if(*(p+k)>*(p+m))
   {
    t=*(p+k);
    *(p+k)=*(p+m);
    *(p+m)=t;
   }
   k++;
  }
  j++;
 }
 return i;
}
//統計在str字串中"a"到"z"26個字母各自出現的次數,並放在指定的陣列中
void *funtotal(char *str,int pp[])
{
 char *p=str;
 int i;
 for(i=0;i<26;i++)
  pp[i]=0;
 while(*p)
 {
  if(*p>='a'&&*p<='z')
   pp[*p-'a']++;
   p++;
 }
}
//查詢str中值為x的元素,返回該字元序列值為x的元素各個,並把這些值為x的元素下標依
//次在指的陣列中
int fun_search(char *str,char ch)
{
  char *p=str;
  char *t;
  int i=0;
  int n=0;
  t=(char *)malloc(strlen(str));
  while(*p)
  {
    if(*p==ch)
     t[n++]=i;
    p++;
    i++;
  }
  return n;
}
//查詢字元序列中0字元連續出現的最長長度,如果有幾個0字元長度相同,只記錄最後一個0字元的相關
//的相關資訊,並返回最長0字元的長度和最後0的下標
int fun_search_string(char *str,int *m,int *k)
{
 char *p;
 int bb[N];
 int i,j;
 *m=0;
 *k=0;
 p=str;
 for(i=0;i<N;i++)
  bb[i]=0;
 i=0;
 while(*(p+i))
 {
  if(*(p+i)=='0')
  {
   bb[j]++;
   i++; 
  }
  else
  {
   j++;
   i++;
  }
  if(*m<bb[j])
  {
   *m=bb[j];
   *k=i-1;
  }
 }
}
char *my_memcopy(char *pvTo,char *pvFrom,size_t size)
{
 char *p=pvTo;
 char *q=pvFrom;
 while(size-->0)
  *pvTo++=*pvFrom++;
 return pvTo;
}
//按條件刪除一個字串指定字元一半的數目,如果字串所包含的指定字元的個數是奇數,
//則不刪除,如果是偶數,則刪除
void fun_del_string1(char a[],char b[],char c)
{
 int i,j,m,n;
 i=0;
 j=0;
 n=0;
 m=0;
 while(a[i]!='\0')
 {
  if(a[i]==c)
   n++;
   i++;
 }
 i=0;
 if(n%2)
 {
  while(a[j]!='\0')
  {
   b[j]=a[j];
   j++;
  }
  b[j]='\0';
 }
 else
 {
  while(a[i]!='\0')
  {
    b[j++]=a[i];
    if(a[i]==c)
    m++;
    if(m>n/2&&a[i]==c)
     j--;
    i++;
  }
  b[j]='\0';
 }
}
//將s所指字串下標為奇數的字元刪除,串中剩餘字元形成的新串放在所指陣列中
void fun_del_string2(char *s,char t[])
{
 int i,k;
 int len;
 k=0;
 len=strlen(s);
 for(i=0;s[i]!='\0';i++)
  if(i%2==0)
   t[k++]=s[i];
   t[k]='\0';
}
//將s所指字串除了下標為奇數、同時ASCI碼值為偶數的字元外,其餘的刪除
void fun_del_string3(char *s,char t[])
{
 int i,k,len;
 k=0;
 for(i=0;s[i]!='\0';i++)
  if((i%2!=0)&&(s[i]%2==0))
  t[k++]=s[i];
  t[k]='\0';
}
//求字串中最後一次出現的子字串的地址
char  *fun_string_address(char *s,char *t)
{
 char *p,*r, *a;
 a=NULL;
 while(*s)
 {
  p=s;r=t;
  while(*r)
   if(*r==*p)
   {
     r++;
     p++;
   }
   else
    break;
   if(*r=='\0')
    a=s;
  s++;
 }
 return a;
}
//判斷字元ch是否與所指字串str中的某個字元相同;若相同,則什麼做,若不同,則將其插在串的最後
void fun_search_same(char *str,char ch)
{
 while(*str&&*str!=ch)
  str++;
  if(*str=='\0')
  {
    str[strlen(str)-1]=ch;
    str[strlen(str)+1]='\0';
  }
}
//將字串中的內容逆置
void fun_nizhi(char *s)
{
 int i,t,n=strlen(s);
 i=0;
 for(;i<n/2;i++)
 {
  t=*(s+i);
  *(s+i)=*(s+n-1-i);
  *(s+n-1-i)=t;
 }
}
//將所指字串中每個單詞的最後一個字母改成大寫
void fun_convert_last_toupper(char *p)
{
 while(*p)
 {
  if(*p==' ')
  {
   *(p-1)=toupper(*(p-1));
   p++;
  }
  else
  p++;
 }
}
//刪除字串中所有的空格
void fun_del_space(char *str)
{
 int i,j;
 j=0;
 for(i=0;str[i]!='\0';i++)
  if(str[i]!=' ')
   str[j++]=str[i];
   str[j]='\0';
}
//把字元str下標為非素數從刪除,把字元下標為素數的字元重新儲存在str
char  *fun_shushu(char *str)
{
 int i,j,flag;
 int k;
 int len;
 char *p;
 p=str;
 len=strlen(str);
 k=0;
 for(i=0;i<len;i++)
 {
  if(i>1)
   str[k++]=str[i];
  flag=1;
  for(j=2;j<i&&flag;j++)
   if(i%j==0)
   {
    flag=0;
    k--;
   }
 }
 str[k]='\0';
 return str;
}
//將在字串中s的字元按逆序存放到t中,然後把s的字元正序連線到串的後面
void  fun_connect(char *s,char *t)
{
 int i,len;
 char *p;
 p=s;
 len=strlen(s);
 for(i=0;i<len;i++)
  t[i]=s[len-1-i];
 for(i=0;i<len;i++)
  t[len+i]=s[i];
  t[2*len]='\0';
}
//從鍵輸入一個字串及一個指定字元,然後把這個字元及其後面的所有字元全部刪除
char  *fun_del_string_after(char *str,char ch)
{
 int i;
 char *p;
 p=str;
 i=0;
 while(str[i]!='\0')
 {
  if(str[i]==ch)
   break;
  i++;
 }
 str[i]='\0';
 return str; 
}
//首先把B所指字串中的字元接逆序存放,然後將A所指字串中的字元和B所指字串中的字元,按排列的順序交叉
//合併到C所指陣列中去,過長的剩餘字元接在C指陣列的尾部.
char  *fun_hebing(char *a,char *b,char *c)
{
 int i,j;
 char ch;
 char *p;
 p=c;
 i=0;
 j=strlen(b)-1;
 while(i<j)
 {
  ch=b[i];
  b[i]=b[j];
  b[j]=ch;
  i++;
  j--;
 }
 while(*a||*b)
 {
  if(*a)
  {
   *c=*a;
   c++;
   a++;
  }
  if(*b)
  {
   *c=*b;
   c++;
   b++;
  }
 }
 *c='\0';
 return p;
}
//統計字串各母音字母的個數,不分大小寫
void fun_total_yuan_yin_leter(char *s,int num[5])
{
 int k,i=5;
 for(k=0;k<i;k++)
  num[k]=0;
 for(;*s;s++)
 {
  i=-1;
  switch(*s)
  {
   case 'a': case 'A':
    {
     i=0;
     break;
    }
   case 'e': case 'E':
    {
     i=1;
     break;
    }
   case 'i': case 'I':
    {
     i=2;
     break;
    }
   case 'o': case 'O':
    {
     i=3;
     break;
    }
   case 'u': case 'U':
    {
     i=4;
     break;
    }  
  }
 if(i>=0)
  num[i]++;
 }
}
//把字串P中所有字元複製字串B中,要求每複製3個字元之後插入一個空格.
void fun_insert_character(char *p,char *b)
{
 int i,k=0;
 while(*p)
 {
  i=1;
  //將前三個字元複製過去
  while(i<=3&&*p)
  {
   b[k]=*p;
   k++;
   i++;
   p++;
  }
  //插入空格
  if(*p)
  {
   b[k++]=' ';
  }
 }
 b[k]='\0';
}
//除了尾部*號之外,將字串其他的*號全部刪除,形參P指向字串最後一個字元
void fun_del_singhao(char *a,char *p)
{
 int i;
 char *t=a;
 for(;t<=p;t++)
  if(*t!='*')
   *(a++)=*t;
 for(;*t!='\0';t++)
  *(a++)=*t;
  *a='\0';
}
//統計一行中單詞的個數,作為函式值返回.一行字串在主函式中輸入
int fun_total_word(char *s)
{
 int i,j=0;
 for(i=0;s[i]!='\0';i++)
  if(s[i]!=' '&&s[i+1]!=' '||s[i+1]!='\0')
   j++;
 return j;
}
//刪除字串所有的星號
void fun_del_singhao1(char *a)
{
 int i,j=0;
 for(i=0;a[i]!='\0';i++)
  if(a[i]!='*')
   a[j++]=a[i];
  a[j]='\0';
}
//刪除尾部的星號
void fun_del_singhao2(char *a)
{
 while(*a)
  a++;
 a--;
 while(*a=='*')
 a--;
 *(a+1)='\0';
}
//刪除前面的星號
void fun_del_singhao3(char *a)
{
 char *p=a;
 while(*p=='*') 
  p++;
 for(;*p!='\0';p++,a++)
  *a=*p;
  *a='\0';
}
//刪除中間的星號
void fun_del_singhao3(char *a)
{
 
}
//主函式
int main()
{
 int n;
 n=my_search("askdaskaskdaskg","ask");
 printf("%d\n",n);
}

暫時就到這裡了

相關文章