1.strlen
函数原型:
size_t strlen( const char *string );
size_t
是无符号整型,相当于unsigned int
const char *string
是目标字符串
函数作用: 计算字符串的长度。
函数的模拟实现:
size_t _strlen(const char * str) {
assert(str);
int count = 0;
while (*str) {
count++;
str++;
}
return count;
}
strlen函数的缺陷: 函数返回值是 size_t
所以有时候会发生一些意想不到的结果。
#include <stdio.h>
#include <string.h>
int main() {
int i = -1;
char str[] = "abcd";
if (strlen(str) > i) {
printf("YES\n");
}
else {
printf("NO\n");
}
return 0;
}
以上这段代码 strlen
算出来结果很明显是 4
,用 4
和 i变量
去进行比较,那结果肯定是输出 YES
。但是由于 strlen
返回的是无符号整数,所以这里会发生算术转换(自动类型转换),那么算术转换就会把 -1
转换为无符号整数,-1
的补码是全 1
转换成无符号数是一个非常大的整数。所以最后的结果是 NO
。
2.strcpy
函数原型:
char *strcpy( char *strDestination, const char *strSource );
char *strDestination
是目标字符串的起始地址const char *strSource
是源字符串(需要拷贝过去的字符串)char *strcpy
拷贝结束后,返回目标字符串的起始地址,方便函数的链式访问
函数作用: 拷贝字符串。
函数的模拟实现:
char* _strcpy(
char * dest,
const char * src
) {
assert(dest && src);
char* temp = dest;
while (*dest++ = *src++);
return temp;
}
strcpy函数的缺陷:
1.strcpy
拷贝的时候会拷贝 '\0'
,所以源字符串中必须有 '\0'
,如果没有'\0'
会造成strcpy
越界访问。
2.目标字符串的空间必须要比源字符串的空间大,否则会造成程序异常崩溃。
3.strcat
函数原型:
char *strcat( char *strDestination, const char *strSource );
char *strDestination
是目标字符串的起始地址const char *strSource
是源字符串(需要追加上去字符串)char *strcat
追加结束后,返回目标字符串的起始地址,方便函数的链式访问
函数作用: 追加字符串。
函数的模拟实现:
char* _strcat(
char* dest,
const char* src
) {
assert(dest && src);
char* temp = dest;
while (*dest) {
dest++;
}
while (*dest++ = *src++);
return temp;
}
strcat函数的缺陷:
1.strcat
追加的时候会追加 '\0'
,所以源字符串中必须有 '\0'
,如果没有'\0'
会造成strcat
越界访问。
2.目标字符串中也要有'\0'
,因为strcat
是从目标字符串'\0'
的位置开始追加。
3.目标字符串的空间必须要比源字符串的空间大,否则会造成程序异常崩溃。
4.strcat
不可以追加同一个字符串。
4.strcmp
函数原型:
int strcmp( const char *string1, const char *string2 );
-
const char *string1
是第一个字符串的起始地址 -
const char *string2
是第二个字符串的起始地址 -
int strcmp
返回一个整型- > 0 说明第一个字符串大于第二个字符串
- < 0 说明第一个字符串小于第二个字符串
- = 0 说明两个字符串相等
函数作用: 判断字符串是否相等。
函数的模拟实现:
int _strcmp(
const char* string1,
const char* string2
) {
assert(string1 && string2);
while ( (*string1 == *string2) && (*string1) && (*string2) ) {
string1++;
string2++;
}
return *string1 - *string2;
}
int main() {
char str1[] = "abcdf";
char str2[] = "abcdf";
printf("%d" , _strcmp(str1 , str2));
return 0;
}