字符函数和字符串函数(一次过)
Posted 雨轩(小宇)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符函数和字符串函数(一次过)相关的知识,希望对你有一定的参考价值。
字符函数和字符串函数
求字符串的长度
strlen
- strlen这个库函数是用来求字符串的长度的
函数原型:size_t strlen ( const char * str );
注意
- 字符串已经 ‘\\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\\0’ 前面出-现的字符个数(不包含 ‘\\0’ )。
- 参数指向的字符串必须要以 ‘\\0’ 结束。
- 注意函数的返回值为size_t,是无符号的( 易错 )
strlen函数的模拟实现
size_t my_strlen(const char* str)
{
assert(str != NULL);//断言检查指针是否有效,后面实现其他库函数都是一样的作用
int len = 0;
while (*str++ != '\\0')//当指到'\\0',也就是末尾的时候,结束
len++;
return len;
}
int main()
{
char str1[]="hello world!";
printf("%d", my_strlen(str1));
return 0;
}
长度不受限制的字符串函数
strcpy
- strcpy是字符串复制函数,将字符串2复制到字符串1
函数原型:char* strcpy(char * destination, const char * source );
注意
- 源字符串必须以 ‘\\0’ 结束。
- 会将源字符串中的 ‘\\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
strcpy函数的模拟实现
char * my_strcpy(char* dest, const char* str)
{
//检查指针有效性
assert(dest != NULL && str != NULL);
char* s = dest;
//s指向dest起始的地址
//*str赋值给*dest,当找到*dest='\\0'的时候,也就是*str为'\\0',赋值给*dest的时候,就停止了
while ((*dest++ = *str++) != '\\0')
{
NULL;
}
return s;//循环终止,返回s
}
int main()
{
char str1[] = "hello world!";//复制过来需要注意接受的数组的容量必须足够大,或者接受不了,不安全
char str2[] = "xiaobite!";
printf("%s", my_strcpy(str1, str2));
printf("\\n%s", str1);
return 0;
}
strcat
- strcat是字符串链接函数,能将字符串2链接在字符串1的后面
函数原型:char * strcat ( char * destination, const char * source )
注意
- 源字符串必须以 ‘\\0’ 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
- 字符串自己给自己追加,如何?(这个问题库函数模拟实现后再说)
strcat函数的模拟实现
char* my_strcat(char* dest, const char* s)
{
//str指向的dets的起始地址
char* str = dest;
//检查指针是否有效
assert(dest && s);
//找到*dest='\\0'的时候停止
while (*dest)
{
dest++;
}
//这里再讲*s赋值给*dest,一直找到*s为'\\0'为止,最后返回str
while (*dest++ = *s++)
{
;
}
return str;
}
int main()
{
char s1[20] = "hello ";//这里需要注意容量,一般是字符串,弄到字符串数组中,容量一定要够大
char* s2 = "bit.";
my_strcat(s1, s2);
printf("%s", s1);
return 0;
}
strcmp
- strcmp是字符串比较函数,比较字符串s1和s2,如果第一个字母相等,则比较下一个字母,直到找出谁大谁小,或者找到s1和s2相等。
函数原型:int strcmp ( const char * str1, const char * str2 );
注意
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
strcmp函数的模拟实现
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2);//检查指针是否有效
while (*s1 == *s2)//当*s1和*s2相等的时候,就继续往后走
{
//记住看while,因为*s1和*s2相等,才到这个if这里来的,注意一下
if (*s1 == '\\0')//如果*s1为空,则证明*s1和*s2相等
return 0;
s1++;
s2++;
}
//当*s1和*s2不相等的时候,就直接返回他们的差值
return *s1 - *s2;
}
int main()
{
char *str1 = "abcde";
char *str2 = "abcdef";
int ret = my_strcmp(str1, str2);
if (ret > 0)
printf("str1大");
else if (ret < 0)
printf("str2大");
else
printf("str1与str2相等");
return 0;
}
长度受限制的字符串函数介绍
strncpy
- strncpy作用跟strcpy是一样的,只不过strncpy有长度限制,而strcpy没有长度限制
函数原型:char * strncpy ( char * destination, const char * source, size_t num );
注意
- 拷贝num个字符从源字符串到目标空间。
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
strncpy函数的模拟实现
char * my_strncpy(char* dest, const char* str,size_t n)
{
assert(dest != NULL && str != NULL);
char* s = dest;
while (n--)
{
*dest++ = *str++;
}
return s;
}
int main()
{
char str1[] = "hello world!";
char str2[] = "xiaobite!";
printf("%s", my_strncpy(str1, str2, 3));
printf("\\n%s", str1);
return 0;
}
strncat
1.strncat作用跟strcat作用一样,但也有长度的限制
函数原型:char * strncat ( char * destination, const char * source, size_t num );
strncat函数的模拟实现
char* my_strncat(char* dest, const char* s,size_t n)
{
char* str = dest;
assert(dest && s);
while (*dest)
{
dest++;
}
while (n--)
{
*dest++ = *s++;
}
return str;
}
int main()
{
char s1[20] = "hello ";
char* s2 = "bit.";
my_strncat(s1, s2, 1);
printf("%s", s1);
return 0;
}
strncmp
- strncmp函数作用同strcmp一样,只不过也有长度限制
函数原型:int strncmp ( const char * str1, const char * str2, size_t num );
注意
- 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
strncmp函数的模拟实现
int my_strncmp(const char* s1, const char* s2,size_t n)
{
assert(s1 && s2);
while (n--)
{
if (*s1 == *s2)
{
if (*s1 == '\\0')
return 0;
s1++;
s2++;
}
}
return *s1 - *s2;
}
int main()
{
char *str1 = "abcde";
char *str2 = "ebf";
int ret = my_strncmp(str1, str2,3);
if (ret > 0)
printf("str1大");
else if (ret < 0)
printf("str2大");
else
printf("str1与str2相等");
return 0;
}
字符串查找
strstr
- strstr是在目标字符串查找是否存在该子串,如果存在,则返回目标字符串后面的子串
函数原型:char * strstr ( const char *, const char * );
strstr函数的模拟实现
char* my_strstr(const char* dest, const char* s)
{
assert(dest && s);
const char* str1 = NULL;
const char* str2 = NULL;
const char* p = dest;
//如果s为空字符串,直接返回str1
if (*s == '\\0')
return (char*)dest;
while (*p)
{
str1 = p;
str2 = s;
while ((*str1 == *str2)&&str1&&str2)
{
str1++;
str2++;
}
//如果为子串,则返回主串匹配后面的字符串
if (*str2 == '\\0')
return (char*)p;
p++;
}
return NULL;
}
int main()
{
const char* s1 = "abbbbcde";
const char* s2 = "bb";
printf("%s", my_strstr(s1, s2));
return 0;
}
strtok
错误信息报告
strerror
字符操作
内存操作函数
memcpy
memmove
memset
memcmp
以上是关于字符函数和字符串函数(一次过)的主要内容,如果未能解决你的问题,请参考以下文章