1. strlen
strlen函数是用来计算字符串长度的(只能计算字符串,应为该函数内部计算结束条件是遇到'\0')
int main()
{
char arr[] = "abcdefg";
printf("%d", strlen(arr));
return 0;
}
结果:
7
为什么说strlen函数的计算结束条件是遇到'\0'呢?
int main()
{
char arr[] = "abc\0defg";
printf("%d", strlen(arr));
return 0;
}
结果:
3
因为strlen函数就是为字符串服务的,在c语言中任何字符串最后面都会给你补上一个'\0'
2. strcpy(拷贝函数)
strcpy的作用就是将一个字符串复制到一个数组里面(数组的空间一定要够大)
destination是一个数组的访问地址
source是要复制到数组的,字符串的地址
返回值:复制操作完成后,将数组的访问地址返回回去
(这边注意,复制的过程中会将字符串中的'\0'也复制过去)
看代码:
int main()
{
char arr[] = "xxxxxxxxxx";//10个x
strcpy(arr, "abc");
printf("%s", arr);
return 0;
}
代码结果:
abc
看图:
从这里可以看出来,strcpy函数在覆盖的过程中,会连带源字符串的'\0'一起覆盖过去
再看一个代码:
int main()
{
char arr[] = "xxxxxxxxxx";//10个x
char arr1[] = "yyyyyyyyy";
strcpy(arr, arr1);
printf("%s", arr);
return 0;
}
看结果:
yyyyyyyyyy
因为strcpy函数的俩个参数的类型是char*类型的,所以只要是char*类型的指针地址都可以传过去 。
既然都是char*的地址,那是不是就可以让我们要覆盖的位置往后走一走
看代码:
int main()
{
char arr[] = "xxxxxxxxxx";//10个x
strcpy(arr+3, "abc");
printf("%s", arr);
return 0;
}
结果:
xxxabc
3. strcmp(比较函数)
strcmp函数的功能是对比俩个字符串是否相等,然后返回相应的值(返还一个整型)
参数部分因我们只是对比,并不需要改变他们的值,都是const char*的类型
看代码:
int main()
{
char arr[] = "abcdefg";//第四个字符是d
char arr1[] = "abceefg";//第四个字符是e
printf("%d", strcmp(arr,arr1));
return 0;
}
看结果:
-1
strcmp函数对比的时候,不是所俩个字符串所以的字符都一一对比过去的
4. strcat(追加函数)
strcat是一个对字符串进行追加字符的函数
参数部分一个char* 一个const char*,前者我们需要对其进行追加字符,所以需要修改,后者只是提供源字符串,所以不需要修改是const char*
返回值是目标地址,也就是被追加字符的那个字符串的地址
看代码:
int main()
{
char arr[20] = "abc";//确保数组空间足够大
printf("%s", strcat(arr, "defg"));
return 0;
}
结果:
abcdefg
但是我们切记,千万不可以自己追加自己,看代码:
这是我自己模拟的strcat函数,我们可以看到的是如果是自己追加自己的话,那么第二个循环永远进不去,并且该函数的参数就是char* 和const char*类型的,第二个参数是不可修改的
5. strncpy(*拷贝函数)
strncpy和strcpy的区别就是有无长度限制 ,也就是多了一个参数num(无符号整型)
这里主要要注意一下源字符串的'\0'也算一个长度
就是如果num大于source的长度,小于等于destination长度,那么拷贝完sourcee的内容后,后面不够拿'\0'来填充
6. strncmp(*比较函数)
strncpm和strcmp的区别也是加了长度参数num(无符号整数)
例:
很明显arr2是大于arr1的,但是应为我们限制了比较的字符个数,所以他对比到f就结束了对比,后面他就不管了,直接相等返回0
7. strncat(*追加函数)
strncat和strcat的区别也是有一个长度限制,其他的都一样,都会在追加结束后,在末尾添加一个'\0’\
总结
理论上strncat strncmp strncpy会比strcat strcmp strcpy更安全,使用时还是根据实际情况来选择