指針與字符串

字符串可以用數組(指針常量)或指針變量來表示。指針常量是不可以進行自增(++)和自減(--)操作的,其地址是固定的,不可以再給它賦值一個地址;而對於指針變量而言,不能夠由輸入的方式來完成賦值的操作。

談到字符串的操作,不外乎計算字符串長度、字符串拷貝、字符串連接、字符串比較。

(1)字符串長度

int stringLength(char* str)
{
	int Len=0;

	while(*str!='\0')
	{
		Len++;
		str++;
	}
	return Len;
}

(2)字符串拷貝

void stringCopy(char* dest,char* src)
{
	while((*dest=*src)!='\0')
	{
		src++;
		dest++;
	}
}

以上要注意的是,需要將src指向字符串的空字符'\0'也拷貝到dest指向內存中,這點不要忽視。

將指針src指向的字符串內容賦值給指針dest所指向的內存空間,因而需要保證dest所指向內存空間要足夠大。

如: 

char* t;
char* src="dddd";
stringCopy(t,src);
由於t是指針變量,且沒有一個指向的內存空間,因而運行會報錯。因而需要給指針變量t分配內存空間。

//char* t=new char[80];
char* t=(char*)malloc(80*sizeof(char));
char* src="dddd";
stringCopy(t,src);

如果僅僅需要將src所指字符串中的n個字符拷貝到src所指內存空間,其拷貝函數如下:

void stringCopy_n(char* dest,char* src,int n)
{
	int i=1;
	while((i<=n)&&((*dest=*src)!='\0'))
	{
		src++;
		dest++;
		i++;
	}
	*dest='\0';
}

(3)字符串連接函數

void stringConcate(char* dest,char* src)
{
	
	while(*dest!='\0')
	{
		dest++;
	}
	while((*dest=*src)!='\0')
	{
		src++;
		dest++;
	}
}

確保dest指向內存空間足夠大。

將src所指的前n個字符連接在dest所指字符串後。

void stringConcate_n(char* dest,char* src,int n)
{
	int i=1;
	while(*dest!='\0')
	{
		dest++;
	}
	while((i<=n)&&((*dest=*src)!='\0'))
	{
		src++;
		dest++;
		i++;
	}
}

(4)字符串比較

int stringCompare(char* str1,char* str2)
{
	while(*str1!='\0')
	{
		if(*str1==*str2)
		{
			str1++;
			str2++;
		}
		else
		{
			return *str1-*str2;
		}
	}
	return 0;
}

比較前n個字符

int stringCompare_n(char* str1,char* str2,int n)
{
	int i=1;
	while((*str1!='\0')&&(i<=n))
	{
		if(*str1==*str2)
		{
			str1++;
			str2++;
			i++;
		}
		else
		{
			return *str1-*str2;
		}
	}
	return 0;
}

(5) 內容交換

void SwapPointer(char *p,char*q)
{
   char temp;
   int n1=strlen(p);
   int n2=strlen(q);
 
   if(n1>n2)
   {
	   for(int i=0;i<n2;i++)
	   {
		   temp=p[i];
		   p[i]=q[i];
		   q[i]=temp;
	   }
	   for(int i=n2;i<n1;i++)
	   {
		   q[i]=p[i];
	       p[i]='\0';
	   }
   }
   else
   {
	    for(int i=0;i<n1;i++)
	   {
		   temp=p[i];
		   p[i]=q[i];
		   q[i]=temp;
	   }
	   for(int i=n1;i<n2;i++)
	   {
		   p[i]=q[i];
	       q[i]='\0';
	   }
   }
}

   char s1[]="dddffff";
   char s2[]="qweeeee";

此種是可以的,將字符串內容賦值給s1,s2所指空間中,相當於副本,因而其內容是可以改變的。

   char *s1="dddffff";
   char *s2="qweeeee";

以上就不行,將常量字符串的地址賦給s1和s2,其內容是受保護的。可用以下函數:

void SwapStr(char **str1,char** str2)
{
    char* temp=*str1;
	*str1=*str2;
	*str2=temp;
}



(6)內存設置


 

void* my_memset(void* ret,int b,size_t size)
{
	assert(ret!=NULL);
	char* src=(char*)ret;
	while(size>0)
	{
		*(src++)=(char)b;
		size--;
	}
	return src;
}

 

參考 蔡明志寫的《指針的編程藝術》

發佈了62 篇原創文章 · 獲贊 23 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章