字符串可以用數組(指針常量)或指針變量來表示。指針常量是不可以進行自增(++)和自減(--)操作的,其地址是固定的,不可以再給它賦值一個地址;而對於指針變量而言,不能夠由輸入的方式來完成賦值的操作。
談到字符串的操作,不外乎計算字符串長度、字符串拷貝、字符串連接、字符串比較。
(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;
}
參考 蔡明志寫的《指針的編程藝術》