目录
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)
{
s1++;
s2++;
}
if (*s2 == '\0')
return(char*)cur;
cur++;
}
return NULL;
}
strtok的使用
strtok()
是C标准库中的一个函数,用于将字符串分割为标记(token)。它可以帮助你按照指定的分隔符将字符串分割成多个部分。
strtok()
函数的原型定义在 <string.h>
头文件中:
char *strtok(char *str, const char *delim);
在第一次调用时,str
应该是要分割的字符串,delim
是用来分割字符串的分隔符集合。之后如果你想继续分割同一个字符串,你可以将 str
参数设置为 NULL
。
strtok()
函数会返回分割后的子字符串,并且在内部保存一个静态指针指向字符串中未处理的部分。每次调用 strtok()
时,它会从上一次结束的地方开始继续分割。
strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存它在字符串的位置。
strtok函数的第一个参数为NULL,函数在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回NULL指针。
int main()
{
char arr[] = "hello*world/432";
char* sep = "*/";
char* str = NULL;
for(str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s\n", str);
}
return 0;
}
char*sep中可保存多个分隔符
//str = strtok(arr, sep)第一次找到后返回NULL,后str = strtok(NULL, sep)找到断点位置循环
strerror的使用
strerror()
是C标准库中的一个函数,用于将错误码转换为对应的错误消息字符串。这个函数非常有用,可以帮助程序员在出错时获得可读的错误信息。
strerror()
函数的原型定义在 <string.h>
头文件中:
char *strerror(int errnum);
errnum
参数是一个表示错误码的整数值,通常是由系统调用或库函数返回的错误码。strerror()
函数会根据给定的错误码返回对应的错误消息字符串。
加上头文件#include <errno.h>
当代码出现错误时,会有一个全局变量errno储存报错信息