目录
一、字符分类函数
二、字符转换函数
三、strlen的使⽤和模拟实现
1.strlen使用
2.strlen函数的模拟实现
四、 strcpy的使⽤和模拟实现
1.strcpy使用
2.strcpy函数的模拟实现
五、strcat的使用和模拟实现
1.strcat的使用
2.strcat的模拟实现
六、strcmp的使用和模拟实现
1.strcmp的使⽤
2.strcmp模拟实现
七、strncpy函数的使用
八、 strncat函数的使用
九、strncmp函数的使用
十、strstr函数使用和模拟实现
1. strstr使用
2.strstr模拟实现
十一、 strtok函数的使用
十二、 strerror函数的使用
总结
一、字符分类函数
<cctype> (ctype.h) - C++ Reference (cplusplus.com)
可以通过以上这个网站找到相关函数的参数和作用
islower函数演示
练习:写一个代码,将字符串的小写字母转大写,其他字符不变
代码如下:
#include <stdio.h>
#include <ctype.h>
int main()
{
char arr[] = "I Am a Student";
// I Am a Student\0
// 0123
int i = 0;
while (arr[i] != '\0')
{
//之前:if (arr[i] >= 'a' && arr[i] <= 'z')
//之后:
if(islower(arr[i]))
{
arr[i] -= 32;
}
i++;
}
printf("%s\n",arr);return 0;
}
结果展示:
二、字符转换函数
#include <stdio.h>
#include <ctype.h>
int main()
{
//printf("%c\n", toupper('a'));
//printf("%c\n", toupper('B'));
//printf("%c\n", tolower('B'));
char arr[] = "I Am a Student";
// I Am a Student\0
// 0123
int i = 0;
while (arr[i] != '\0')
{
//之前:if (arr[i] >= 'a' && arr[i] <= 'z')
//之后:
//if(islower(arr[i]))
if(isupper(arr[i]))
{
//arr[i] = toupper(arr[i]);
arr[i] = tolower(arr[i]);
}
i++;
}
printf("%s\n",arr);return 0;
}
运行结果:
三、strlen的使⽤和模拟实现
strlen函数:
- 求字符串的长度,统计的是\0之前的字符个数
- 字符串中必须有\0
- strlen的使⽤需要包含头⽂件
1.strlen使用
#include<string.h>
int main()
{
if ((int)strlen("abc") - (int)strlen("abcdef")>0)
{
printf(">\n");
}
else
{
printf("<=0\n");
}
return 0;
}
结果展示:
2.strlen函数的模拟实现
方式1:
//计数器⽅式
int my_strlen(const char * str)
{
int count = 0;
assert(str);
while(*str)
{
count++;
str++;
}
return count;
}
方式2:
//计数器⽅式
#include<assert.h>
size_t my_strlen(const char* s)
{
assert(*s !=NULL);
int count = 0;
while (*s != '\0')
{
count++;
s++;
}
return count;
}
方式3:
//指针-指针的⽅式
int my_strlen(char *s)
{
assert(str);
char *p = s;
while(*p != ‘\0’ )
p++;
return p-s;
}
结果展示:
四、 strcpy的使⽤和模拟实现
strcpy函数:
- •源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷⻉到⽬标空间。
- ⽬标空间必须⾜够⼤,以确保能存放源字符串。
- ⽬标空间必须可修改。
1.strcpy使用
int main()
{
char arr1[] = "hello bit";
char arr2[20] = "xxxxxxxxxxxxxxx";
strcpy(arr2, arr1);printf("%s\n", arr2);
//%s遇到\0不打印
return 0;
}
结果展示:
2.strcpy函数的模拟实现
char* my_strcpy(char* des, const char* src)
{
assert(*des != NULL);
assert(*src != NULL);
//拷贝\0之前的
char* ret = des;
while (*des++ = *src++)
{
;
}
return ret;
//拷贝\0之后的
*des = *src;
}
int main()
{
char arr1[] = "hello bit";
char arr2[20] = "xxxxxxxxxxxxxxx";
my_strcpy(arr2, arr1);printf("%s\n", arr2);
//%s遇到\0不打印
return 0;
}
结果展示:
一趟冒泡排序后,如果 一对没有交换,就说明已经有序了
五、strcat的使用和模拟实现
strcat函数:
- 源字符串必须以 '\0' 结束。
- ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
- ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
- ⽬标空间必须可修改
1.strcat的使用
int main()
{
char arr1[20] = "hello ";//hello world
char arr2[] = "world";
//char arr2[] = {'w','o','r','l','d'};//err
//char* s = my_strcat(arr1, arr2);
//printf("%s\n", arr1);
//printf("%s\n", s);
printf("%s\n", strcat(arr1, arr2));return 0;
}
结果展示:
2.strcat的模拟实现
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
//1.找到目标空间的\0
while (*dest != '\0')
{
*dest++;
}
//2.拷贝
while (*dest++ = *src++)
{
;//空语句
}
return ret;
}
int main()
{
char arr1[20] = "hello ";//hello world
char arr2[] = "world";
//char arr2[] = {'w','o','r','l','d'};//err
char* s = my_strcat(arr1, arr2);
printf("%s\n", arr1);
printf("%s\n", s);
printf("%s\n", my_strcat(arr1, arr2));return 0;
}
结果展示:
六、strcmp的使用和模拟实现
strcmp函数:
- 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
- 第⼀个字符串等于第⼆个字符串,则返回0
- 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
1.strcmp的使⽤
int main()
{
//char arr1[] = "abcedf";
//char arr2[] = "abcedf";
//if (arr1 == arr2)//比较的是地址
//{//}
//if ("abcedf" == "abcedf")//也比较的是地址,首字符的地址比较
//{//}
//如果要比较两个字符串的内容,需要使用strcmp
//int strcmp(const char* str1,const char* str2)
char arr1[] = "abqedf";
char arr2[] = "abc";
int ret = strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
结果演示:
2.strcmp模拟实现
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;}
int main()
{
char arr1[] = "abqedf";
char arr2[] = "abdf";
int ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
结果展示:
七、strncpy函数的使用
- 拷⻉num个字符从源字符串到⽬标空间。
- 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。
int main()
{
char arr1[] = "abcedf";
char arr2[20] = {0};
strncpy(arr2, arr1, 8);printf("%s\n", arr2);
}
结果展示:
八、 strncat函数的使用
- 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字
符 - 如果source指向的字符串的⻓度⼩于num的时候,只会将字符串中到\0 的内容追加到destination指向的字符串末尾。
int main()
{
char arr1[] = "abcedf";
char arr2[20] = "xx\0xxxxxxx";
int len = strlen(arr1);
strncat(arr2, arr1, len);printf("%s\n", arr2);
}
结果展示:
九、strncmp函数的使用
- ⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。
int main()
{
char arr1[] = "abcedf";
char arr2[20] = "abq";
int ret = strncmp(arr1, arr2, 6);printf("%d\n", ret);
}
结果展示:
十、strstr函数使用和模拟实现
- 函数返回字符串str2在字符串str1中第⼀次出现的位置。
- 字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志。
1. strstr使用
int main()
{
char arr1[] = "this is an apple";
const char* p = "pl";
char* ret = strstr(arr1, p);
if (ret != NULL)
{
printf("%s\n", ret);
}
else
{
printf("找不到");}
return 0;
}
结果展示:
2.strstr模拟实现
char* my_strstr(const char* str1, const char* str2)
{
const char* s1 = NULL;
const char* s2 = NULL;
const char* cur = str1;
if (*str2 == '\0')
{
return (char*)str1;
}
while (*cur)
{
s1 = cur;
s2 = str2;
while (*s1!='\0'&& *s2 != '\0'&& * s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cur;
}
cur++;
}
return NULL;}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "bbq";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
printf("找不到");
else
printf("%s\n", ret);return 0;
}
结果展示:
十一、 strtok函数的使用
- sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合
- 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。
- strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:
- strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改)
int main()
{
char arr[] = "zpengwei@yeah.net@heheh";
char arr2[30] = { 0 };//"zpengwei\0yeah\0net"
strcpy(arr2, arr);
const char* sep = "@.";
char* ret = NULL;for (ret = strtok(arr2, sep); ret != NULL;ret=strtok(NULL,sep))
{
printf("%s\n", ret);
}
//ret = strtok(arr2, sep);
//printf("%s\n", ret);//ret = strtok(NULL, sep);
//printf("%s\n", ret);//ret = strtok(NULL, sep);
//printf("%s\n", ret);return 0;
}
结果展示:
十二、 strerror函数的使用
- strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d: %s\n",i, strerror(i));
}
return 0;
}
结果展示:
打开文件错误时:
int main()
{
//fopen以读的形式打开文件的时候,如果文件不存在,就打开失败
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
//读文件//关闭文件
fclose(pf);return 0;
}
总结
字符函数和字符串函数的使用和模拟实现。