努力更新模拟实现中…
重点:
重点介绍处理字符和字符串的库函数的使用和注意事项
一一一一一一一一分割线一一一一一一一一一
注意:
模拟实现没有全部囊括,只实现了大部分的字符函数(长度不受限制)和内存函数,
实现在每个函数的末尾部分
注意:此图片与以下图片截图均来自cplusplus.com
我们可得这个函数是求在字符串开始与
'\0'
之间的字符串长度
代码示例:
#include
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;
}
结果:
解释:
这里的6和3容易理解,那么str2>str1怎么解释?
因为strlen返回值类型为size_t
类型,为无符号整形,
即相减的结果虽然为一个负数,但负数的无符号整形显然是巨大的正数
故大于
模拟实现strlen
一一一一一一一一分割线一一一一一一一一一
我们可以知道此函数是为了拷贝字符串的
代码示例:
#include
int main()
{
char str1[20] = { 0 };
char str2[] = "hello world";
strcpy(str1, str2);
printf("%s\n", str1);
return 0;
}
结果:
模拟实现strcpy
一一一一一一一一分割线一一一一一一一一一
上边两个函数很容易就可以根据形式看出大概意思,
str代表字符串,那么cat代表什么?
他代表Catenate,连接的缩写,也就是追加字符串的意思
代码示例:
int main()
{
char str1[20] = "abc";
char str2[] = "dfg";
strcat(str1, str2);
printf("%s\n", str1);
return 0;
}
结果:
'\0'
,因为
一一一一一一一一分割线一一一一一一一一一
我们可以得出此函数是为为比较字符串函数
代码示例:
int main()
{
char str1[] = "abb";
char str2[] = "abc";
int ret =strcmp(str1, str2);
printf("%d\n", ret);
return 0;
}
与strcpy功能一致,
但多了n,n代表num,也就意味着我们可以自由的输入想复制的个数
代码示例:
int main()
{
char str[] = "xxxxxxxxxxx";
char str1[20] = { 0 };
printf("%s\n",strncpy(str1, str, 9));
return 0;
}
结果:
一一一一一一一一分割线一一一一一一一一一
与strcat功能一致,
但多了n,n代表num,也就意味着我们可以自由的输入想追加的个数
代码示例:
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;
}
结果:
一一一一一一一一分割线一一一一一一一一一
与strcmp功能一致,
但多了n,n代表num,也就意味着我们可以自由的输入想比较的个数
代码示例:
int main()
{
char str1[] = "abccc";
char str2[] = "abdd";
int ret = strncmp(str1, str2, 3);
printf("%d\n", ret);
return 0;
}
结果:
此函数的注意事项:
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
一一一一一一一一分割线一一一一一一一一一
可以看到此函数是用来寻找一个字符串中是否含有另一个字符串
代码示例:
int main()
{
char str1[] = "abbbbcd";
char str2[] = "bbc";
char* ret = strstr(str1, str2);
printf("%s\n", ret);
return 0;
}
结果:
模拟实现strstr
一一一一一一一一分割线一一一一一一一一一
此函数是分割字符串的函数,依照你提供的sep字符串来进行分割
代码示例:
int main()
{
char str[] = "zhangsan@tt.edu";
char* sep = "@.";
char* ret = NULL;
for (ret = strtok(str, sep); ret != NULL; ret=strtok(NULL, sep))
{
printf("%s\n", ret);
}
return 0;
}
结果:
一一一一一一一一分割线一一一一一一一一一
可以看到此函数可以理解为是一个错误解释函数,如果程序发生错误,会告诉你发生错误的原因
代码示例:
//假设我们没有创建次文件
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
printf ("打开文件失败: %s\n",strerror(errno));
//errno: Last error number
return 0;
}
结果:
一一一一一一一一分割线一一一一一一一一一
既然有字符穿拷贝函数,那么也会有内存拷贝函数,因为我们有时不仅要拷贝字符串,还要对一些整形之类的进行操作,于是就有了内存拷贝函数,而其中的size_t类型的num就是要操作的大小,单位是字节
代码实现:
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 12);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
}
代码示例:
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 12);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
}
结果:
一一一一一一一一分割线一一一一一一一一一
与memcpy如出一辙,只不过可以实现了内存重叠的操作
代码示例:
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memcpy(arr1+2, arr1, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
}
结果:
一一一一一一一一分割线一一一一一一一一一
与strcmp大致相同,一个字节一个字节的比较,但不限于字符串
代码示例:
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,2 };
int ret=memcmp(arr1, arr2, 12);
printf("%d\n", ret);
return 0l;
}
结果:
欢迎小伙伴的纠错与提问