字符串函数解析即函数的实现 _C语言
该解析为学习分享所用 参考了多种资料 在此不在赘述资料名称
strcpy()
先上一段代码
//使用这个函数 源字符串必须包含'\0'
//目标空间必须足够大 足以储存被拷贝的内容
//背拷贝的空间必须是可修改的
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest,const char* src){
assert(dest != NULL);
assert(src != NULL);
//记录目的字符串起始地址
char* ret = dest;
//拷贝src指向的字符串到dest指向的空间 包含'\0'
while(*dest++ = *src++){
;
// '\0'的ascii码值是0
}
//返回目的空间的起始地址
return ret;
}
int main(void){
char arr1[] = "abcdefghi";
char arr2[] = "bit";
my_strcpy(arr1,arr2);//把arr2 拷贝到 arr1 上
puts("arr1");
return 0;
}
1.strcpy()的返回值是 char* 类型
2.第一个参数是目标地址,所以第一个参数不必指向 数组的开始,这个属性可以用于拷贝数组的一部分
strcpy拷贝长度由\0绝定 极有可能被误用导致地址的非法访问
受长度限制的字符串函数 strncpy()
第三个参数是拷贝的字符数 说拷贝几个就拷贝几个 '\0’也包含在字符数内
比如说
str1[10] = “abcdef”;
str2[] = “cmdn”
strncpy(str1,str2,4);
在内存中得到得实际是 cmdndef\0
也就是不会拷贝\0上去,因为在str2中 \0在第五个字符处
str1[10] = "abcdef";
str2[] = "cmdn"
strncpy(str1,str2,6);
也就是说当我指定的个数比源字符串字符数量大时
多余的部分补充的字符是'\0'
在内存中得到得实际是 cmdn\0\0\0\0\0\0
strcat()
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* dest, const char* src){
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
while (*dest++){
;
}
while (*dest++ = *src++){
;
// '\0'的ascii码值是0
}
return ret;
}
int main(void){
char arr1[20] = "hello";
char arr2[] = "world";
strcat(arr1, arr2);
// 在\0处向后追加 源头里要包含\0
// 字符串不能自己给自己追加 程序会崩溃
my_strcat(arr1, arr2);
puts(arr1);
return 0;
}
受长度限制的字符串函数 strncat() 第三个参数指定了最大添加字符数
遇见 ‘\0’ 或者 达到最大添加字符数 就停止追加字符
但是无论以何种方式追加结束 strncat()总是希望追加结束后该串还是一个
字符串,所以会主动添加’\0’
如果追加的字符串没有达到指定长度,如下所示
int main(void){
char arr1[30] = “zxcvbnm\0aaaaaaaaaaaa”
char arr2[] = “world”;
strncat(cat1,cat2,8);
puts(cat1);
return 0;
}
输出结为zxcvbnmworld\0aaaaaaaa
所以如果达到第二个字符串最大长度 呢么追加也会停止
strcmp()
因为 strcmp() 比较的是对应字符的ASCII码值,这个属性说明了
strcmp()不止能比较字母,而是能比较所有字符
不过绝大多数情况下 我们不关心 strcmp()的返回值
只需要关心返回值是否为0 也就是两个字符串相等否相等
warning: strcmp 函数比较的是字符串,不是字符,所以其参数应该是字符串
(也就是一个字符串的地址)而不是一个字符
根据小学三年级的知识可以得出 char类型实际上是整数类型 所以可以使用关系
运算符来比较字符
具体代码实现如下
int my_strcmp(const char* str1, const char* str2){
assert(str1 && str2);
while(*str1 == *str2){
if(*str1 == '\0') return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int main(void){
char *p1 = "abcdef";
char *p2 = "sbcdef";
//int ret = strcmp(p1, p2);
//比的不是长度
//strcmp()函数是根据ACSII码的值来比较两个字符串的;
//strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,
//若差值为零则继续比较下去;若差值不为零,则返回对应值(每个编译器返回的值不同)。
//直到出现不同的字符或遇’\0’为止
// VS2013下
// 第一个 大于 第二个 返回 1
// 第一个 等于 第二个 返回 0
// 第一个 小于 第二个 返回-1
//但是字符串不相等时不一定返回1 和 -1
int ret = my_strcmp(p1, p2);
printf("%d\n",ret);
return 0;
}
strncmp()函数在比较两个字符串时,可以比较到字符不同的地方
也可以只比较第三个参数指定的字符数。