</pre><pre name="code" class="objc">
#include"stdio.h"
#include"assert.h"
/**
'\0' --字符串结束符
*/
int my_strlen(char* const s);
char* my_strcpy(char* dest,const char* src);
int my_strcmp(const char *str1,const char* str2);
char* my_strcat(char* dest,const char* src );
char* my_strstr(const char *s1,const char *s2);
char*my_strncat(char *dest, const char *src, int n);
char* my_substr(char* dest,const char* str,int a,int b);
//-----------------------------------------------------------------------------------------------------------//
void main(){
char* st="dsafdsff";///---这里的字符串是常量,在常量池中。不是在栈中--不可变
char str[]="abcde"; //这里数组大小为5个,编译器根据读出字符串大小给数组分配空间大小----这里的字符串在栈中,在栈中申请的空间存储的--可变
char dest[]="a"; //--假如这里用字符指针,则下面的字符串复制不能成功
//注意:存储字符串的目的地要用字符数组。
//这里定义dest数组很有问题吗,这里定义了一个字符数组dest,但是只有一个字符的空间存储。
//my_strcat(dest,str),---这个字符串拼接导致dest要存储的数据增加--这样就会溢出,导致拼接后的字符串会占用更多的栈空间,这就可以和其他数据重叠了。
char* str2="1hasfdsd";
printf("%s", my_strcat(dest,str));
while(1);
}
//-----------------------------------------------------------------------------------------------------------//
//求字符串长度
int my_strlen(char* const s){
int i=0;
for(i;s[i];i++);
return i;
//or while(s[i]){i++;} return i;
}
//-----------------------------------------------------------------------------------------------------------//
//复制字符串--是字符串值的复制,而不是简单的指针复制
//Note:传入的dest不能是字符指针,因为字符指针指向的常量字符串,它的值是不能改变的。
//了解:另外strdup()也是复制字符串函数,由malloc()动态分配,无需事先初始化指针,但不是标准c库函数,而且缺点很多--不建议用这个函数
char* my_strcpy(char* dest,const char* src){
//0-最简单的实现如下
assert(src);//断言函数,如果值为假,则将打印错误信息并退出程序
assert(dest!=NULL); //或者assert(src!=NULL && dest!=NULL);
char* dest_tmp=dest;
while((*dest++ = *src++)!='\0');//while((* dest = * src) != '\0'){dest++;src++;}
return dest_tmp;
}
//-----------------------------------------------------------------------------------------------------------//
//字符串比较函数
int my_strcmp(const char *str1,const char* str2){
assert(str1!=NULL && str2!=NULL);
while(*str1!='\0' ||*str2!='\0'){
if(*str1>*str2){
return 1;
}else if(*str1<*str2){
return -1;
}else{
if(*str1=='\0') return 0;
str1++;
str2++;
///if(*str1=='\0' && *str2=='\0') return 0;//这句话用下面的return 0;替代
}
}
return 0;//这里可以替代上面的一句
}
//-----------------------------------------------------------------------------------------------------------//
//追加字符串--拼接字符串 //不能改变src的字符串值,可以加const
//eg: 输入 abc de 得到 abcde
char* my_strcat(char* dest,const char* src ){
assert(dest!=NULL && src!=NULL);
/* char *tmp=dest;
while(*dest++); //while(*tmp++);
while(*src){ *dest++=*src++;}//means -- while( (*tmp++=*src++)!='\0');
return tmp;//---也可以把*/
//这个正确
char *tmp=dest;
while(*tmp)tmp++; //while(*tmp++);
while( *tmp++ = *src++);//means --while( (*tmp++=*src++)!='\0');
return dest;
}
//-----------------------------------------------------------------------------------------------------------//
//字符串拼接----strSource字符串的前n个字符串添加到dest后面
char *my_strncat(char *dest, const char *src, int n){
char *tmp=dest;
while(*tmp) tmp++;
while((n--)&&(*tmp++ = *src++)); //n要在前面
return dest;
}
//-----------------------------------------------------------------------------------------------------------//
// strstr()字符串中查找特定子字符串第一次出现的位置--返回该位置的指针
//----下面这个方法很普通--查看数据结构KMP算法更加
char * my_strstr(const char *s1,const char *s2)
{
if (*s1 == 0)
{
if (*s2)
return (char *) NULL;
return (char *) s1;
}
while (*s1)
{
size_t i;
i = 0;
while (1)
{
if (s2[i] == 0)
{
return (char *) s1;
}
if (s2[i] != s1[i])
{
break;
}
i++;
}
s1++;
}
return (char *) NULL;
}
//-----------------------------------------------------------------------------------------------------------//
//取出字符串的子串
char* my_substr(char* dest,const char* str,int a,int b){
assert(str!=NULL);
char*tmp=dest;
int k=0;
while(*tmp)tmp++;
while(k!=a){str++;k++;}
// printf("k=%d ",k);
while( k<=b) //有错误,没找到??--原因:dest和str很容易重叠,
{ // 因此输出还会出现乱码。--这点要解决---重叠问题-//查看memcpy(dest,src,strlen(src)+1);
*tmp=*str;
if(k==b)break;
k++;
tmp++;
str++;
}
return dest;
}