strlen——计算'\0' 前面出现的字符个数
size_t strlen ( const char * str );
- 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。
- 参数指向的字符串必须要以 '\0' 结束。
- 注意函数的返回值为size_t,是无符号的( 易错 )
int my_strlen(const char* arr)
{
assert(arr);
//1 计数
int count = 0;
while (*arr != '\0')
{
count++;
arr++;
}
return count;
//2 指针
char* p = arr;
while (*arr != '\0')
{
++arr;
}
return arr - p;
//3 递归
if(*arr!='\0')
{
return (1 + my_strlen(arr + 1 ));
}
return 0;
}
strcpy——拷贝
char* strcpy ( char * destination , const char * source );
- 源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
char* my_strcpy(char* dst, const char* src)
{
assert(dst && src);
char* t = dst;
while (*dst++ = *src++)
{
;
}
return t;
}
strcat——在字符串后面追加
char * strcat ( char * destination , const char * source );
- 源字符串必须以 '\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间数据必须可修改。
- 字符串自己给自己追加,会出问题
char* my_strcat(char* dst, const char* src)
{
assert(dst && src);
char* p = dst;
assert(dst && src);
while (*dst)
{
dst++;
}
while (*dst++ = *src++)
{
;
}
return p;
}
strcmp——比较字符串的大小
int strcmp ( const char * str1, const char * str2 );
规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
int my_strcmp(const char* src1, const char* src2)
{
assert(src1 && src2);
while (*src1 == *src2)
{
if (*src1 == '\0') return 0;
src1++;
src2++;
}
return *src1 - *src2;
}
strcat,strcmp,strcpy的长度不受限制,因此编译器认为他们不太安全。
strstr——在字符串中匹配字符串
char * strstr ( const char * str1 , const char * str2 );
规定:
- 在str1中找字符串str2,找到就会返回字符在的地址
- 没有找到就返回NULL
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
//如果是空就直接返回
if (*str2 == '\0') return str1;
//设置三个指针
const char* s1 = str1;
const char* s2 = str2;
const char* cp = str1;
while (*cp)
{//每次都要把cp赋值给s1,s2=str2
s1 = cp;
s2 = str2;
while (*s1!='\0' && *s2!='\0' && *s1 == *s2)
{
s1++;
s2++;
}
//当s2找完了,就返回cp
if (*s2 == '\0') return cp;
cp++;
}
return NULL;
}
strtok——分割字符串
char * strtok ( char * str , const char * sep );
- sep参数是个字符串,定义了用作分隔符的字符集合
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。
- strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
- strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
- strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
使用方法
int main()
{
char *p = "zhangpengwei@bitedu.tech";
const char* sep = ".@";
char arr[30];
char *str = NULL;
strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep))
{
printf("%s\n", str);
}
return 0;
}
strerror——返回错误码所指的错误信息
char * strerror ( int errnum );
使用方法
printf ( "Error opening file unexist.ent: %s\n" , strerror ( errno ));
若是想要更方便,可以用perror(),直接打印错误信息。