1.1:strlen(const char* )
使用注意事项:
1:求得是字符串长度,函数遇到\0为结束标志,返回的是\0之前的字符串的个数(不包括\0)。
2:参数指向的字符必须以\0结束
3:size_t放回的无符号的整形(易错点)
4: 模拟实现
模拟思路
首先参数部分设计,我们需要传入的是一个数组那么我们用指针来接受数组首地址,我们返回值设计成size_t 因为求字符不能是负数,
算法设计:既然求字符串那么我们就判断它是否为\0不是的话我们指针++,再定义一个count++ ,直到遇到\0我们返回count就可以得到数值
理论存在实践开始
size_t my_strlen(const char* arr) { size_t count = 0; assert(arr); while (*arr != 0) { arr++; count++; } return count; }
加上const是为了防止指针被修改,加上assert是防止传过来的是空指针
1.2strcpy(char* dest,char*sour)
作用是用来复制字符到另外一个字符里面;
注意:原字符串必须以\0结尾
会把原字符串的、0拷贝到目标函数里边
空间必须足够大
目标空间必须可变
模拟实现(思路)例题
参数设计,我们要接受俩个函数一个是目标函数还有一个是原函数那么我们参数部分设计俩个char*,返回值我们放回被复制地址的首地址char* ret
算法思路:首先我们定义一个ret来存放目标函数的首地址,然后我们进行赋值直到原函数到、0结束然后美赋值一次++一次,最后完成循环我们放回目标函数的首地址
实践开始
我有个问题为什么我加上&&*sour!=0会乱码?
我知道卡啦,因为加上我的判断在我判断是、0的时候就会跳出循环,\0不会赋值给ret的最后那一个地址所以系统就会一直读取导致乱码
char* my_strcpy(char* dest, const char* sour) { assert(dest && sour); char* ret = dest; while ((*dest++=*sour++)) { ; } return ret; }
1.3strcat(char*dest,char*sour)
函数作用:将源字符串的副本追加到目标字符串。目标字符串中的结束null字符被source的第一个字符覆盖,并且在destination中由两者串联形成的新字符串的末尾包含一个空字符。
注意:
目的字符串必须可以改变
源字符串必须以 '\0' 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。Example
int main () { char str[80]; strcpy (str,"these "); strcat (str,"strings "); strcat (str,"are "); strcat (str,"concatenated."); puts (str); return 0; }
输出结果
模拟实现
参数部分设计还是需要俩个char*来接收这个数组,返回值我们同样放回dest的首地址用char*变量接受收,
算法部分,我们既然要把源函数的首元素赋值给目标函数的末尾,那么我们可以找到目标函数的最后一个数,然后进行赋值,直到赋值到原函数的末尾。在定义一个ret来接受目标函数首地址最后放回
char* my_strcat(char* dest, const char* sour) { assert(dest && sour); char* ret = dest; while (*dest!= 0) { dest++; } while (*dest++ = *sour++) return ret; }
1.4 strcmp(char*dest,char*sour)
函数作用:比较C字符串str1和C字符串str2。这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续执行以下对,直到字符不同或达到终止空字符为止。
注意事项:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字那么如何判断两个字符串?
函数实例
int main() { char arr1[] = { "adfasfas" }; char arr2[] = { "dfafasfd" }; int ret=strcmp(arr1, arr2); if (ret > 0) { printf(">"); } else if(ret<0) { printf("<"); } else { printf("=="); } return 0; }
输出结果 :<
模拟实现
参数部分:参数部分设计还是需要俩个char*来接收这个数组,返回值我们用int来接收大于就放回>0
函数实现:这样来设计我们先假设他们都相等,写一个while循环来判断,条件是他们相等,如果不相等跳出来比较那俩个数,大于放回1,小于返回-1
int my_strcmp (const char * src, const char * dst) { int ret = 0 ; assert(src != NULL); assert(dest != NULL); while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) ++src, ++dst; if ( ret < 0 ) ret = -1 ; else if ( ret > 0 ) ret = 1 ; return( ret ); }
1.5:字符串升级
1:char* strncat( char* dest,const char*sour,size_t num):
函数简介:将源的第一个num个字符添加到目标,加上一个结束的空字符。如果source中的C字符串的长度小于num,则只复制结束空字符之前的内容。
实例:
模拟实现
设计思路
参数部分依然是俩个参数dest和sour俩个字符函数来接收,还有一个参数num类型size_t
返回值我们放回目标函数首地址,
实现部分,我们先找到目标函数的最后一个字符,然后直接拼接num字节的数据加上
char* my_strncat(char* dest, const char* sour, size_t num) { assert(dest && sour); char* ret = dest; while (*dest++) {}//找到目标函数最后一个字符 dest--;//将字符串移回末尾 while ((*dest++ = *sour++) && num--){} *dest = '\0'; return ret; }
2 int strncmp ( const char * str1, const char * str2, size_t num );
函数简介:比较两个字符串的字符比较C字符串str1的最多num个字符与C字符串str2的字符。这个函数开始比较每个字符串的第一个如果它们彼此相等,则继续执行后面的对,直到字符不相同,直到达到终止的空字符,或者直到两个字符串中的num字符匹配,以先发生的为准。参数num比较的是前多少个数
举
模拟实现思路跟strcmp思路一样多一个参数和条件,while里面多放一个num--
int my_strcmp(const char* des, const char* src,size_t num) { assert(des && src); while (num--) { if (*des == *src) { if (*des == '\0') return 0; des++; src++; } else if(*des > *src) { return 1; } else { return -1; } } } int main() { char arr[] = "abbedf"; char arr1[] = "abc"; int ret=strncmp(arr, arr1,4); if (ret > 0) printf(">\n"); else if (ret < 0) printf("<\n"); else printf("==\n"); return 0; }