网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- [模拟实现](#_367)
+ [strtok](#strtok_394)
+ - [例子](#_406)
一、求字符串长度
strlen
- 功能:获取字符串长度
- 参数:c字符串(str)
- 返回值:字符串长度(无符号整形size_t)
- 字符串将 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
例子
#include <stdio.h>
#include <string.h>
int main()
{
const char\* str1 = "abcdef";
const char\* str2 = "bbb";
printf("%d\n", strlen(str1));
printf("%d\n", strlen(str2));
if (strlen(str2) - strlen(str1) > 0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}
模拟实现
- 计数器方式
int my\_strlen(char\* str)
{
int len = 0;
while (\*str)
{
str++;
len++;
}
return len;
}
- 不创建临时变量
int my\_strlen(const char\* str)
{
if (\*str == '\0')
return 0;
else
return 1 + my\_strlen(str + 1);
}
- 指针-指针
int my\_strlen(char\* s)
{
char\* p = s;
while (\*p!='\0')
{
p++;
}
return p - s;
}
二、长度不受限制的字符串函数
strcpy
- 功能:复制字符串
- 参数:目的字符串(destination)源字符串(source)
- 返回值:目的字符串
- 源字符串必须以 ‘\0’ 结束
- 会将源字符串中的 ‘\0’ 拷贝到目标空间
- 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须可变
例子
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "Sample string";
char str2[40];
char str3[40];
strcpy(str2, str1);
strcpy(str3, "copy successful");
printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
return 0;
}
模拟实现
char\* my\_strcpy(char\* dest, const char\* src)
{
char\* ret = dest;
//assert需要加入头文件assert.h
assert(src != NULL);
assert(dest != NULL);
while (\*dest++=\*src++)
{
}
return ret;
}
strcat
- 功能:连接字符串
- 参数:目的字符串(destination)源字符串(source)
- 返回值:目的字符串
- 将源字符串的副本追加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且在目标中由两者串联形成的新字符串的末尾包含一个空字符。
- 目的地和来源不得重叠。
例子
#include <stdio.h>
#include <string.h>
int main ()
{
char str[80];
strcpy (str,"these ");
strcat (str,"strings ");
strcat (str,"are ");
strcat (str,"concatenated.");
puts (str);
return 0;
}
模拟实现
char\* my\_strcat(char\* dest, const char\* src)
{
char\* ret = dest;
//assert需要加入头文件assert.h
assert(dest);
assert(src);
while (\*dest)
{
dest++;
}
while (\*dest++ = \*src++)
{
}
return ret;
}
strcmp
- 功能:比较两个字符串
- 参数:要比较的字符串1(str1)要比较的字符串2(str2)
- 返回值:
返回值 | 表明 |
---|---|
<0 | 第一个不匹配的字符在 PTR1 中的值低于 PTR2 中的值 |
0 | 两个字符串的内容相等 |
>0 | 第一个不匹配的字符在 PTR1 中的值大于在 PTR2 中的值 |
- 此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续下一对,直到字符不同或达到终止空字符
例子
#include <stdio.h>
#include <string.h>
int main()
{
int ret = strcmp("bbq", "bcq");
if (ret > 0)
printf(">\n");
printf("%d\n", ret);
return 0;
}
模拟实现
int my\_strcmp(const char\* str1, const char\* str2)
{
assert(str1 && str2);
while (\*str1 == \*str2)
{
if (\*str1 == '\0')
return 0;
str1++;
str2++;
}
return (\*str1 - \*str2);
}
三、长度受限制的字符串函数
strncpy
- 功能:从字符串中复制字符
- 参数:目的字符串(destination)源字符串(source)要从源中复制的最大字符数(num)
- 返回值:目的字符串
- 拷贝num个字符从源字符串到目标空间
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
- 如果源长度超过 num,则不会在目标末尾隐式附加空字符。因此,在这种情况下,不应将目标视为以空结尾的 C 字符串(这样读取它会溢出)
- 目的地和来源不得重叠
例子
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "To be or not to be";
char str2[40];
char str3[40];
strncpy(str2, str1, sizeof(str2));
strncpy(str3, str2, 5);
str3[5] = '\0';
puts(str1);
puts(str2);
puts(str3);
return 0;
}
strncat
- 功能:从字符串追加字符
- 参数:目的字符串(destination)源字符串(source)要追加的最大字符数(num)
- 返回值:目的字符串
- 将源的第一个数字字符追加到目标,外加一个终止空字符
- 如果源中 C 字符串的长度小于 num,则仅复制终止空字符之前的内容
- 目标空间必须足够大以包含串联的结果字符串,包括其他 null 字符
例子
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20];
char str2[20];
strcpy(str1, "To be ");
strcpy(str2, "or not to be");
strncat(str1, str2, 6);
puts(str1);
return 0;
}
strncmp
- 功能:比较两个字符串的字符
- 参数:要比较的字符串1(str1)要比较的字符串2(str2)要比较i的最大字符数(num)
- 返回值:
返回值 | 表明 |
---|---|
<0 | 不匹配的第一个字符在 str1 中的值低于 str2 中的值 |
0 | 两个字符串的内容相等 |
>0 | 第一个不匹配的字符在 str1 中的值大于在 str2 中的值 |
- 将 C 字符串 str1 的字符数与 C 字符串 str2 的字符数进行比较
- 此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同,直到达到终止的空字符,或者直到两个字符串中的 num 字符匹配,以先发生者为准
例子
#include <stdio.h>
#include <string.h>
int main()
{
char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
int n;
puts("Looking for R2 astromech droids...");
for (n = 0; n < 3; n++)
if (strncmp(str[n], "R2xx", 2) == 0)
{
printf("found %s\n", str[n]);
}
return 0;
}
四、字符串查找
strstr
- 功能:查找子字符串
- 参数:要扫描的字符串(str1)包含要匹配的字符序列的字符串(str2)
- 返回值:指向 str1 中指定的整个字符序列在 str2 中首次出现的指针,如果序列在 str1 中不存在,则为 null 指针
例子
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "This is a simple string";
char\* pch;
pch = strstr(str, "simple");
if (pch != NULL)
strncpy(pch, "sample", 6);
puts(str);
return 0;
}
模拟实现
char\* my\_strstr(const char\* str1, const char\* str2)
{
char\* cp=str1;
char\* s1=str1;
char\* s2=str2;
if (\*str2 == '\0')
return str1;
while (\*cp)
{
s1 = cp;


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
ar\* str1, const char\* str2)
{
char\* cp=str1;
char\* s1=str1;
char\* s2=str2;
if (\*str2 == '\0')
return str1;
while (\*cp)
{
s1 = cp;
[外链图片转存中...(img-XRTpSvQK-1715851064865)]
[外链图片转存中...(img-PeZohNLO-1715851064865)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**