字串(C/C++)
在書本上看到的關於字串的一些演算法
#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);
}
暫時就到這裡了
相關文章
- c++ 分割字串C++字串
- C++:字串總結C++字串
- c++ vector容器、字串C++字串
- C++陣列 字串C++陣列字串
- c/c++ c語言字元與字串C++C語言字元字串
- C/C++學習筆記:字串C++筆記字串
- C++中字串的使用C++字串
- C++ 字串使用詳解C++字串
- C++中字串讀取C++字串
- C++/C:數字轉成字串, 字串轉成數字C++字串
- 力扣#43 字串相乘(C++)力扣字串C++
- C++讀書筆記:字串C++筆記字串
- C++字串常見混淆方案C++字串
- C/C++中的字串另類連線C++字串
- C++常用字串分割方法C++字串
- 獲取C/C++字串、字元陣列長度C++字串字元陣列
- C++分割字串,及strtok函式使用C++字串函式
- c++字串查詢函式實現C++字串函式
- C++中的字串編碼處理C++字串編碼
- C++ Qt開發:字串QString容器C++QT字串
- C++ 標準庫-字串 string 類C++字串
- c++中字串之string和charC++字串
- C/C++字串筆試知識點及例項C++字串筆試
- c++中數字和字串的轉換C++字串
- (C++字串大小寫轉換)相似的句子C++字串
- C++將數字轉為字串,並拼接C++字串
- 【每週例題】力扣 C++ 字串相乘力扣C++字串
- C/C++ Qt StringListModel 字串列表對映元件C++QT字串元件
- .C++整數的N進位制字串表示C++字串
- C++ 練氣期之一文看懂字串C++字串
- c++中utf8字串和gbk字串的轉換C++字串
- 如何用C/C++實現去除字串頭和尾指定的字元C++字串字元
- leetcode344 反轉字串 c++實現LeetCode字串C++
- c++中字元、字串和數字間的轉換C++字元字串
- 劍指offer——把字串轉換成整數C++字串C++
- C++ 字串截斷的實現(基礎函式)C++字串函式
- C++中string字串的基礎操作,學習C++字串
- 2020-10-18C++筆記之C/C++之字串賦值C++筆記字串賦值