天天看點

c語言之字元串處理函數的實作字元串處理函數

字元串處理函數

1.簡介

  • 在c語言的學習過程中,我們會學習很多字元串處理函數,入strlen,strcpy,strcmp等等,使用也特别簡單,隻需要調用庫函數就行。
  • 但是對于c語言初學者來說,作為一個面向過程的語言,了解其函數内的實作過程還非常用必要的。

2.字元串實作函數

strcpy(字元串拷貝函數)

#include <stdio.h>
#define M 50
//指針函數 傳回值為指向字元串str1的指針
char *strcpy(char * str1, const char * str2 )
{
	//判斷 是否為空指針
	if(str1 == NULL || str2 == NULL)
	{
		return NULL;
	}
	char *p = str1;
	while((* str1++ = * str2++) != '\0');
	return p;
}

int main()
{
	char str1[M]={0};
	char str2[M]={0};
	printf("please input str1\r\n");
	fgets(str1,50,stdin);
	char *p = strcpy(str2,str1);
	puts(str2); 
	return 0;
}
           

運作結果

c語言之字元串處理函數的實作字元串處理函數
注意:fgets輸入的時候會将緩存區裡面的回車換行

作為筆試題考察點有四處

  1. 異常處理 str1,str2 是否為NULL
  2. const 的修飾,str2不能被修改需要const來修飾
  3. 字元串會拷貝 ‘\0’
  4. 傳回值(指向str2的指針),可以友善調用者調用

strcmp(字元串比較大小)

**#include <stdio.h>
#define M 50
#define N 50
int Strcmp(const char *str1,const char *str2);
int main()
{
	//輸入兩個字元串
	char str1[M]={0};
	char str2[N]={0};
	printf("please input str1\r\n");
	scanf("%s",str1);
	printf("please input str2\r\n");
	scanf("%s",str2);
	//比較兩字元串的大小
	Strcmp(str1,str2);
	return 0;
}

int Strcmp(const char *str1,const char *str2)
{
	//判斷 是否為空指針
	if(str1 == NULL || str2 == NULL)
 	{
 		 return;
 	}
	int i=0;
	while(*(str1+i)==*(str2+i) && *(str1+i)!='\0')
	{
		i++;
	}
	if( *(str1+i)>*(str2+i) ) 
	{
		printf("str1>str2\r\n");
		return 1;
	}
	else if( *(str1+i) < *(str2+i) )
	{
		printf("str1<str2\r\n");
		return -1;
	}
	else
	{
		printf("str1=str2\r\n");
		return 0;
	}
}
           

運作結果

c語言之字元串處理函數的實作字元串處理函數

作為筆試題考點同上

strcat (字元串拼接函數)

#include <stdio.h>
#include <string.h>
#define M 50
#define N 50
char *str_cat(char*,char*);

int main()
{
	char str1[M]={0};
	char str2[N]={0};
	//輸入兩個字元串
	printf("please input str1\r\n");
	scanf("%s",str1);
	printf("please input str2\r\n");
	scanf("%s",str2);
	char *p=str_cat(str1,str2);
	puts(p);
	return 0;
}

//字元串拼接
char *str_cat(char *str1,char *str2)
{
	//判斷 是否為空指針
	 if(str1 == NULL || str2 == NULL)
  	{
   		 return;
  	}
  	//字元串str1的長度
 	int j=strlen(str1);
 	//字元串str2的長度
 	int k=strlen(str2);
	if( M < (j+k) )
	{
		return ;
	}
	//定義兩個指針
	char *pp=str1;
	char *p=str1+j;
	char *q=str2;
	int i=0;
	for(i=0;i<k;i++)
	{
		*(p+i) = *(q+i);
	}
	return pp;
}
           

運作結果

c語言之字元串處理函數的實作字元串處理函數

strlen(求字元串的長度)

#include <stdio.h>
int mystrlen(char *pStr);
int main()
{
	char str[100] ={0};
	printf("please input str\r\n");
	scanf("%s",str);
	//用變量a來接受函數的傳回值
	int a=mystrlen(str);
	printf("%d\r\n",a);
	return 0;
}

//求字元串的長度
int mystrlen(char *pStr)
{
	if(NULL==pStr)
	{
		return -1;
	}
	int i=0;
	while(pStr[i] !='\0')
	{
		i++;
	}
	return i;
}
           
c語言之字元串處理函數的實作字元串處理函數
注意:strlen 和 sizeof的差別
  • strlen 計算字元串的長度,不計算字元串的結束辨別符 ‘\0’
  • sizeof 計算的是占空間的大小會計算進去

字元串的翻轉

**方法一 **

#include <stdio.h>
#include <string.h>
#define n 50

int main()
{
	//輸入字元
	char arr[n]={0};
	scanf("%s",arr);
	char *p=arr;
	char *q=&arr[strlen(arr)-1];
	int i=0;
	//用指針p指向首位址,q指向字元的尾位址
	for(i=0;i<strlen(arr)/2;i++)
	{	
		char tmp= *(p+i);
		 *(p+i)=*(q-i);
		 *(q-i)=tmp;
	}
	puts(arr);
	return 0;
}
           
c語言之字元串處理函數的實作字元串處理函數

方法二

#include <stdio.h>
#include <string.h>

int main()
{
	char str[100]={0};
	gets(str);
	char *p=str;
	char *q=str+strlen(str)-1;

	while(p<q)
	{
		int tmp=*p;
		*p=*q;
		*q=tmp;
		p++;
		q--;
	}
	puts(str);
	return 0;
}
           

字元串的查找

編寫一個字元串查找函數,函數原型為:

char *str_search(const char *str1, const char *str2),

該函數實作在字元串str1中找出字元串str2第一次出現的位置。

如果str2出現在str1中,則傳回str2在str1中出現的首位址,

如果在str1中沒有與str2比對的字元串則傳回NULL

#include <stdio.h>
#include <string.h>
char *str_search( char *str1, char *str2 );

int main()
{
	//定義兩個字元串
	char str1[20] = {0};
	char str2[20] = {0};
	//指派
	scanf("%s",str1);
	scanf("%s",str2);
	char *q = str_search(str1,str2);
	printf("%s\r\n",q);
	return 0;
}

char *str_search( char *str1, char *str2 )
{
	//定義一個指針指向 str1
	char *p = str1;
	//逐個移動比較
	int i = 0;
	for( i=0; i < strlen(str1); i++ )
	{
		char tmp = *( p+strlen(str2)+i );
		*( p+strlen(str2)+i ) = '\0';
		//比較兩個字元串
		if( 0 == strcmp( str1+i, str2 ) )
		{
			return p+i;
		}	
		*( p+strlen(str2)+i ) = tmp;
	}
	return NULL;
}	
           
c語言之字元串處理函數的實作字元串處理函數

繼續閱讀