目录
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储存报错信息
本文详细介绍了C语言中strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr、strtok和strerror等字符串处理函数的使用方法、模拟实现以及注意事项,帮助读者理解和掌握这些基础的字符串操作技巧。

1058

被折叠的 条评论
为什么被折叠?



