strlen的使用和模拟实现
使用部分:
strlen的原型是size_t strlen(const char* str)
字符串以'\0'作为结束标志,计算'\0'前面出现的字符个数。strlen是size_t类型(无符号整形)
3 - 6 = -3,但因为是无符号整形,没有负数,会被理解成很大的正数。
模拟部分:
strlen的模拟一般用两种方法,一种是设置一个计时器,另一种用指针-指针返回指针之间的元素个数来实现
第三种用递归(不创建临时变量)
第一种
size_t my_strlen(const char* str)
{
int count = 0;
while (*str++)
{
count++;
}
return count;
}
第二种
size_t my_strlen(const char* str)
{
assert(str);
char* st = str;
while (*str)
{
str++;
}
return str - st;
}
第三种用递归
size_t my_strlen(const char* str)
{
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str+1);//这里str+1不能是str++
}
strcpy的使用和模拟实现
使用部分:
原型:char *strcpy(char *dest, const char *src);
strcpy()
函数接受两个参数:
dest
:要复制到的目标字符串的指针。src
:要复制的原字符串的指针。
另外,strcpy在复制字符串时会把原字符串的'\0'复制过去。
使用strcpy时,原字符串必须包含'\0'
目标空间必须可修改,也就是需要拷贝信息的字符串必须是可修改的
模拟部分:
void my_strcpy(char* dest, char* src)
{
/*assert(dest != NULL);
assert(src != NULL);*/
assert(dest && src);
char* s = dest;
while (*dest++ = *src++)
{
}
dest = s;
}
用assert断言,传递的dest与src不能是为空,提高代码的安全性
*dest++ = *src++,虽然++的优先级比*的优先级高,但后置++,先使地址解引用,得到dest和src的内容,后*dest = *src,最后才是地址dest++,src++。
NULL本质上是0,一般用于指针的初始化
\0是\ddd形式的转义字符,本质上也是0,一般字符串的末尾会有'\0',是字符串的结束标志
null和NUL也是\0
'0' 字符0,本质是48,ASCII值为48
strcat的使用和模拟实现
strcat()
是一个 C 语言中的字符串库函数,用于将一个字符串(源字符串)追加到另一个字符串(目标字符串)的末尾
函数原型:char *strcat(char *dest, const char *src);
这个函数返回的是目标空间的地址。
使用要求:1.源字符串必须包含'\0',2.目标字符串也要包含'\0',3.目标空间必须足够大(可容纳源字符串的内容),4.目标空间必须可修改
1.使用部分:
注意,不能自己跟自己添加,会把字符串尾部的'\0'消掉。
2.模拟部分
char* my_strcar(char* dest, const char* src)
{
char* ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
strcmp的使用和模拟实现
strcmp()
是 C 语言中的一个字符串比较函数,用于比较两个字符串的大小。函数的声明如下:
int strcmp(const char *str1, const char *str2);
trcmp()
函数会按照字典顺序(ASCII 值)比较 str1
和 str2
指向的字符串。如果两个字符串相同,返回值为 0;如果 str1
小于 str2
,返回值小于 0;如果 str1
大于 str2
,返回值大于 0。
(从首位开始,比较字符的大小)
使用部分:
模拟部分:
int my_strcmp(const char* s1,const char* s2)
{
//assert(dest && src);
while (*s1 == *s2)//不能用*s1++ == *s2++
{
if (*s1 == '\0')
return 0;
s1++;
s2++;
}
if (*s1 > *s2)
return 1;
else
return -1;
}
str与strn的区别
strcpy strcat strcmp 的长度不受限制的字符串函数----不安全
与scanf的报错一致,不安全
strncpy strncat strncmp 的长度受限制的字符串函数
相对安全
strncpy的使用
strncpy()
是 C 语言中的一个字符串复制函数,用于将一个字符串的一部分复制到另一个字符串中。函数的声明如下:
char *strncpy(char *dest, const char *src, size_t n);
strncpy()
函数会将 src
指向的字符串的最多前 n 个字符复制到 dest
指向的字符串中。如果 src
的长度小于 n,则剩余的部分会用空字符 '\0' 来填充。函数返回指向 dest
的指针。
strncat的使用
strncat()
是 C 语言中的一个字符串追加函数,用于将一个字符串的一部分追加到另一个字符串的末尾。函数的声明如下:
char *strncat(char *dest, const char *src, size_t n);
strncat()
函数会将 src
指向的字符串的最多前 n 个字符追加到 dest
指向的字符串的末尾。函数返回指向 dest
的指针。
追加到末尾时增添一个'\0'
可以自己给自己追加
最多追加源字符串和'\0',再多就不会追加了,与strncpy不一样
strcmp的使用
strncmp()
是 C 语言中的一个字符串比较函数,用于比较两个字符串的前 n 个字符的大小。函数的声明如下:
int strncmp(const char *str1, const char *str2, size_t n);
strncmp()
函数会按照字典顺序(ASCII 值)比较 str1
和 str2
指向的字符串的前 n 个字符。如果两个字符串的前 n 个字符相同,返回值为 0;如果 str1
小于 str2
,返回值小于 0;如果 str1
大于 str2
,返回值大于 0。
strstr的使用与模拟实现
strstr()
是 C 语言中的一个字符串查找函数,用于在一个字符串中查找另一个子字符串第一次出现的位置。函数的声明如下:
char *strstr(const char *haystack, const char *needle);
strstr()
函数会在 haystack
指向的字符串中查找第一次出现 needle
指向的子字符串的位置,并返回该位置的指针。如果找到了子字符串,则返回指向子字符串在原始字符串中的位置;如果未找到,则返回 NULL。
使用部分
模拟部分
查找时会遇到一下三种类似情况。
char* my_strstr(const char* str1, const char* str2)
{
const char* cur = str1;
const char* s1 = NULL;
const char* s2 = NULL;
assert(str1 && str2);
if (!*str2)
return (char*) str1;
while (cur)
{
s1 = cur;
s2 = str2;
while (*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return(char*) cur;
cur++;
}
return NULL;
}