//wang
//有关于字符数组
//在字符数组中,0 ,'\0',null等价
//'\0' == 48
//字符串定义:用“”描述的字符集合,一定有’\0\作为结尾
//只有以'\0’结尾的字符集合才能被称为字符串
1.字符串复制函数的五种代码如下:
第一种(数组型):
void Mystrcpy1(char *desstr, char *srcstr)
{ //把desstr和srcstr当作数组来对待
int i;
for ( i = 0; srcstr[i] != '\0'; i++)
{
desstr[i] = srcstr[i];
}
desstr[i] = '\0';
//不加‘\0'会出现乱码ccccc
}
第二种(只移动指针的下标)
//只移动下标
void Mystrcpy2( char *des, char *src)
{
int i;
for( i = 0; *(src+i) != '\0'; i++)
{
*(des+i) = *(src+i);
}
*(des+i) = '\0';
}
第三种(移动指针):
//移动指针
void Mystrcpy3( char *des, char *src)
{
while( *src != '\0')
{
*des = *src;
src++;
des++;
}
*des = '\0';
}
第四种(改良第三种)
void Mystrcpy4( char *des, char *src)
{
while( *src != '\0')
{
*des++ = *src++;
}
*des = '\0';
}
第五种(一种技巧性代码)
void Mystrcpy5( char *des, char *src)
{
//技巧性代码
while(*des++ = *src++);
}
但是以上的代码都没有一个良好的书写习惯,今天学习到的断言刚好能用到,
断言在release模式中会自动为空函数
//debug模式中会出现提示(即提示给程序哪里有问题)
2.字符串连接
void Mystrcat1(char *des, char *src)
{
while( *src != '\0') //首先目标字符串指针指到末尾
{src++;}
while ( *des != '\0')
{
*src = *des;
des++;
src++;
}
}
void Mystrcat2(char *des, char *src)
{
assert(des!=NULL && src!=NULL);
while(*des) des++; //首先目标字符串指针指到末尾
while(*des++=*src ++); //赋值...直到sorc为空
}
char *Mystrcat(char *des,const char *src)
{
assert(des!=NULL && src!=NULL);
char *p = des;
while(*des!='\0')//首先目标字符串指针指到末尾
{
des++;
}
while(*des++ = *src++);//复制运用第五种复制字符串函数的复制方法
return p;
}
3.字符串比较大小
int Mystrcmp(const char *str1,const char *str2)
{
assert(str1!=NULL && str2!=NULL);
int gap;
while(((gap=*str1-*str2)==0) && (*str1!='\0'))
{
str1++;
str2++;
}
return gap;
}
void Mystrcmp(const char *str1,const char *str2)
{
assert( str1 != NULL && str2 != NULL);
for ( int i = 0; *str1 != '\0', *str2 != '\0'; i++)
{
if ( *str1 > *str2)
return 1;
else if( *str1 < *str2)
return -1;
if( *str1 == '\0' || *str2 == '\0')
return 0;
else if ( * str1 == '\0') return -1;
else return 1;
}
最后完整的代码如下(只是选取了以上算法中的某一种):
//字符串复制
void Mystrcpy(char *des, const char *src)
{
//断言
assert(des!=NULL && src!=NULL)
;
if(des==NULL || src==NULL)
{
return ;
}
while(*src != '\0')
{
*des = *src;
des++;
src++;
}
*des = '\0';
}
//字符串连接
void Mystrcat(char *des, char *src)
{
//断言
assert(des!=NULL && src!=NULL);
while(*des) des++; //首先目标字符串指针指到末尾
while(*des++=*src ++); //赋值...直到sorc为空
}
//字符串比较大小
int Mystrcmp(const char *str1,const char *str2)
{
assert(str1!=NULL && str2!=NULL);
int gap;
while(((gap=*str1-*str2)==0) && (*str1!='\0'))
{
str1++;
str2++;
}
return gap;
}
//字符串的长度
int Mystrlen(const char *str)
{
assert( str != '\0');
int i;
for ( i = 0; *str != '\0'; )
{
i++;
str++;
}
printf("长度为%d\n",i);
return i;
}
int main()
{
char str1[20] = "abcdef";
char str2[10];
char str3[] = "xyz";
Mystrcpy(str2,str1);
printf("str2 = %s\n",str2);
Mystrcat(str1,str3);
printf("连接后为:%s\n",str1);
int gap = Mystrcmp(str1,str3);
printf("%d\n",gap);
Mystrlen(str1);
return 0;
}