(文章目錄)
前言
一.strlen函數
1.用法
計算字元串長度
但應注意 使用 string.h頭檔案
strlen函數傳回值為 unsigned int
#include<stdio.h>
#include<string.h>
int main()
{
if(strlen("abc")-strlen("abcdef")>0)
{
printf(">\n");
}
else
{
printf("<"\n);
}
return 0;
}
如果我們正常來看 strlen("abc" )---- 3 strlen("abcdef')----6
3-6應為 -3 但是-3為無符号數 是以應該輸出-3的補碼
即一個很大的數 為 >
2.模拟實作strlen函數
#include<stdio.h>
#include<assert.h>
int mystrlen(const char*str)//const 在*左邊代表指針指向的内容不能被改變 ,指針本身可以改變
{
assert(str!=NULL);
int sum=0;
while(*str!='\0')
{
sum++;
str++;
}
return sum;
}
int main()
{
char arr[]="hello";
int ret=mystrlen(arr);
printf("%d\n",ret);//5
return 0;
}
二.strcpy函數
1.用法
拷貝函數
将arr2拷貝到arr1中
使用頭檔案<string.h>
但是必須保證arr1能夠放下arr2
需要注意的是 拷貝時 将'\0'也會拷貝過去
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20]="XXXXXXXX";
char arr2[]="hello";
strcpy(arr1,arr2);
printf("%s\n",arr1);//hello
return 0;
}
2.模拟實作strcpy函數
#include<stdio.h>
#inlcude<assert.h>
char* mystrcpy(char*dest,const char*src)//這裡的src為要傳遞arr2,不能改變src指針本身
{
asser(src!=NULL&&dest!=NULL);
char*ret=dest;
while(*dest++=*src++)
{
;
}
return ret;
}
int main()
{
char arr1[20]="XXXXXXXX";
char arr2[]="hello";
mystrcpy(arr1,arr2);
return 0;
}
三.strcat函數
1.用法
字元串追加
但是必須保證arr1數組足夠大
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20]="hello ";
char arr2[]="world";
strcat(arr1,arr2);
printf("%s\n"arr1);//hello worlld
return 0;
}
2.模拟實作strcat函數
#include<stdio.h>
#include<assert.h>
char* strcat(char*dest,const char*src)//srcu所指向的内容不可以改變 指針本身可以改變
{
assert(dest&&src);
char*ret=dest;
while(*dest!='\0')
{
dest++;
}
while(*src!='\0')
{
*dest=*src;//如果dest加上const 此句就會報錯
dest++;
src++;
}
return ret;
int main()
{
char arr1 [20]="hello ";
char arr2[]="world";
char*ret=mystrcat(arr1,arr2);
printf("%s\n,rett);//hello world
return 0;
}
四.strcmp函數
1.用法
比較兩個字元串的大小
必須使用頭檔案 <string.h>
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]="abbb";
char arr2[]="abq";
if(srcmp(arr,arr2)>0)//abbb<abq
{
printf(">"\n);
}
else
{
printf("<"\n);
}
return 0;
}
使用方法: 從首字元開始 如果兩者相等 則繼續向下
若在某個字元 第一個字元大于第二個字元 則數組1>數組2
若 在某個字元 第一個字元小于第二個字元 則數組1<數組2
例:
abbb
abq
b<q 是以abbb<abq
2.模拟實作strcmp函數
#include<stdio.h>
#include<assert.h>//const和assert斷言都可不加 加上是為了代碼的健壯
int mystrcmp(const char*s1,const char*s2)
{
assert(s1&&s2);
while(*s1==*s2)
{
if(*s2=='\0')
{
return 0;
}
s1++;
s2++;
}
if(*s1>*s2)
{
return 1;
}
else
{
return -1;
}
int main()
{
char arr1[]="abbb";
char arr2[]="abq";
int ret= mystrcmp(arr1,arr2);
printf("%d\n",ret);//-1
return 0;
五.strstr函數
1.用法
strstr函數是在一個字元串中尋找另一個字元串
必循使用<string.h>頭檔案
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]="abcdefabcdef";
char arr2[]="bcd";
char*p=strstr(arr1,arr2);
if(p==NULL)
{
printf("沒找到\n");
}
else
{
printf("找到了:%s\n",p);//bcdefabcdef
}
return 0;
}
2.模拟實作strstr函數
#include<stdio.h>
#include<assert.h>
char*mystrstr(const char*str1,const char*str2)
{
const char*s1=str1;
const char*s2=str2;
const char*cp=str1;
if(*s2==='\0')
{
return (char*)str1;//str1也為const修飾的 是以需要強制類型轉換
}
while(*cp)
{
s1=cp;
s2=str2;
while(*s1&&*s2&&(*s1==*s2))//為了防止兩者相同的情況發生
{
s1++;
s2++;
}
if(*s2=='\0')
{
return (*cp);//cp為const修飾的 想要傳回char* 要強制類型轉換
}
cp++;
}
return NULL;
int main()
{
char arr1[]="abbbcdef";
char arr2[]="bbc";
char*p=mystrtsr(arr1,arr2);
if(p==NULL)
{
printf("沒找到\n");
}
else
{
printf(找到了:%s",p);//bbcdef
}
return 0;
}
六.strtok函數
1.用法
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "[email protected]";
const char* p = "@ .";
char tmp[20] = { 0 }; //strtok一般會切割字元串 是以用臨時拷貝
strcpy(tmp, arr);
char* ret = NULL;
ret = strtok(tmp, p);//第一次傳字元串本身 會将第一次遇見的分隔符變成'\0'并傳回起始位置位址
printf("%s\n", ret);
ret = strtok(NULL, p);//為NULL時 在上次分隔符開始 直到再次遇見分隔符 變成'\0'
printf("%s\n", ret);
ret = strtok(NULL, p);
printf("%s\n", ret);
return 0;
}