天天看點

字元串函數(一)之常見用法前言一.strlen函數二.strcpy函數三.strcat函數四.strcmp函數五.strstr函數六.strtok函數

(文章目錄)

前言

一.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;
}