C語言中有關字串的程式設計題
阿新 • • 發佈:2019-01-10
(1)字串拷貝strcpy
特點:只能拷貝字串,遇到\0停止拷貝
char* MyStrcpy(char* dst,const char* src)
{
assert(dst != NULL && src != NULL);
char* dstaddr = dst;//如果要返回值,必須重新定義一個指標指向目標指標,然後返回定義的這個指標,因為本來的dst已經++走到末尾了
while(*src != '\0')
{
*dst++ = *src++;
}
*dst = '\0';
//while(*dst++ = *src++);或者只用這一句while就可以
return dstaddr;
}
(2)實現memcpy拷貝
特點:對記憶體拷貝,可以拷貝任何內容,拷貝n個位元組
void * memcpy(void *dst,,const void * src,int n)
{
assert(dst != NULL && src != NULL && n>0);
char* d = (char*)dst;//必須強轉為其他型別,因為void*型別不能進行++操作
char* s = (char*)src;
while(n - -)
{
*d++ = *s++;
}
return dst;//為了實現鏈式操作,將目標地址返回,因為d++多次,所以不能返回d
}
memcpy與memmove都可以進行對記憶體的拷貝,區別是如果兩個指標記憶體有重疊,memcpy可能不安全,memmove是安全的。
記憶體方面主要有三種情況:
第一種,記憶體不重疊,拷貝沒有問題
第二種,指標dst > src+n,從src前面開始拷,此時拷貝也不會有問題
第三種:src > dst,這種情況memcpy會出現問題。因為如果從src前面開始拷貝,會自己把自己的後面覆蓋掉。但是這種情況下memmove的處理方法是從後開始拷貝,所以比較安全。
(4)實現memmove拷貝
void* memmove(void* dst,void* src,int n)
{
assert(dst != NULL && src != NULL && n>=0);
char *d = (char*)dst;//必須強轉為其他型別
char* s = (char*)src;
if(dst <= src || (char*)dst >= (cha*)src+n)//src在dst前面或者有重疊但不影響,正向拷
{
while(n - -)
{
*d++ = *s++;
}
}
else
{
d = d+ n -1;//d指向後面,開始拷
s = s+ n -1;
while(n - -)
{
*d - - = *s - -;
}
}
return dst;
}
(5)求字串長度
int Strlen(const char* str)
{
assert(str != NULL);
int len = 0;//初始化不能忘
while(*str != '\0')
{
len++;
str++;
}
return len;
}
(6)字串連線
char* Strcat(char* dst, const char*src)
{
assert(dst != NULL && src != NULL);
char * p = dst;
while(*dst != '\0')
{
dst++;
}
while(*src != '\0')
{
*dst++ = *src++;
}
*dst = '\0';//不能忘
return p;
}
(7)字串比較
int Strcmp(const char*str1,const char*str2)
{
assert(str1 != NULL && str2 != NULL);
int tmp = 0;
while(((tmp = *str1-*str2) == 0) && *str1!='\0')
{//字母相同繼續朝前走,只要遇到字母不一樣,不論是否遍歷完,都跳出
str1++;
str2++;
}
return tmp;
}
(8)字串逆置
char* StrReverse(char *str)
{
char tmp;
char* s = str;
char *p = str;
while(*p != '\0')
{
p++;
}
p - -;//while迴圈中p走到了\0位置,但是逆置時不能把\0也逆置了
while(str < p)
{
tmp = *str;
*str = *p;
*p =tmp;
p - -;
str++;
}
return s;//為了實現鏈式操作,返回
}