(1)strlen函数的使用与模拟
strlen函数用于获取字符串的长度,不包括末尾的’\0’.
#include<stdio.h>
#include<string.h>
int main() {
char arr [] = "abcdefghi";
size_t len = strlen(arr);
printf("%zd\n", len);
return 0;
}
模拟:
三种实现方式:计数器,递归,指针-指针。
size_t my_strlen1(const char* arr) {
//用计数器的方式
char* cur = arr;
size_t size = 0;
while (*cur != '\0') {
size++;
cur++;
}
return size;
}
size_t my_strlen2(const char* arr) {
//采用递归的方式
if (*arr == '\0') {
return 0;
}
return 1 + my_strlen2(arr + 1);
}
size_t my_strlen3(const char* arr) {
//采用指针减指针的方式
char* cur = arr;
while (*cur != '\0') {
cur++;
}
return cur - arr;
}
int main() {
/*char arr [] = "abcdefghi";
size_t len = strlen(arr);
printf("%zd\n", len);*/
//对于strlen函数的模拟实现:
//三种方式:
char arr[] = "abcdefghi";
size_t len = my_strlen1(arr);
printf("%zd\n", len);
len = my_strlen2(arr);
printf("%zd\n", len);
len = my_strlen3(arr);
printf("%zd\n", len);
return 0;
}
(2)strcpy函数的使用与模拟
strcpy函数用于拷贝字符串到另外一个数组中去!
拷贝时将字符串末尾的’\0’也拷贝过去!
使用:
int main() {
char arr[] = "abcedfhrj";
char arr1[20] = "xxxxxxxxxxxxxxxxxxx";
strcpy(arr1, arr);
printf("%s\n", arr1);
}
模拟:
#include<stdio.h>
char* my_strcpy(char *dest,const char * src) {
char* cur1 = src;
char* cur2 = dest;
while (*dest++ = *cur1++) {
;
}
return cur2;
}
int main() {
char arr[] = "abcedfhrj";
char arr1[20] = "xxxxxxxxxxxxxxxxxxx";
/*strcpy(arr1, arr);
printf("%s\n", arr1);*/
//对于strcpy函数的模拟实现:
my_strcpy(arr1, arr);
printf("%s\n", arr1);
return 0;
}
(3)strcmp函数的使用与模拟
本函数用于比较两个字符串的大小
比较的规则是从左往右比较对应的字符,如果对应的字符大,则说明字符串大,返回大于0的数字反之则小,
返回小于0的数字,如果相等返回0,在VS中,返回的数字是1,-1,0。
使用:
#include<stdio.h>
int main() {
//本函数用于比较字符串:、
char arr1[] = "hello";
char arr2[] = "hellob";
int ret = strcmp(arr1, arr2);
printf("%d\n", ret); //如果左边字符串小,则返回小于0的数
//如果左边字符串大,则返回大于0的数
//如果相等,则返回0.
//模拟实现
/*int ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);*/
return 0;
}
模拟:
int my_strcmp(const char* arr1,const char* arr2) {
//开始比较:
//如果两个字符串前面的字符相等,则往后遍历,
while (*arr1 == *arr2) {
//当字符串比较到两个'\0'相等时。
if (*arr1 == '\0') {
return 0;
}
arr1++;
arr2++;
}
//找到不同的字符后
return *arr1 - *arr2;
}
int main() {
//本函数用于比较字符串:、
char arr1[] = "hello";
char arr2[] = "hellob";
/*int ret = strcmp(arr1, arr2);
printf("%d\n", ret); */ //如果左边字符串小,则返回小于0的数
//如果左边字符串大,则返回大于0的数
//如果相等,则返回0.
//模拟实现
int ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
(4)strcat 函数的使用与模拟
strcat函数的作用是在字符串后面添加字符串!
#include<stdio.h>
int main() {
char* arr1 = "hello";
char arr2[20] = "world";
strcat(arr2, arr1);
//对于strcat函数进行模拟实现
//my_strcat(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
模拟:
void my_strcat(char* dest, const char* src) {
//在第一个字符串的末尾找到\0,然后开始添加字符
char* ret = dest;
while (*dest!= '\0') { //这里有问题!
//如果判断条件写成*dest++!='\0',则当*dest ='\0'时,dest依然会++!
dest++;
}
//拷贝
while (*dest++ = *src++) {
;
}
}
int main() {
char* arr1 = "hello";
char arr2[20] = "world";
//strcat(arr2, arr1);
//对于strcat函数进行模拟实现
my_strcat(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
两组函数的区别:
(5)strncpy函数
//strncpy函数设定了函数复制字符串中字符的个数
int main() {
char arr1[20] = "xxxxxxxxxxxx";
char arr2[] = "world";
strncpy(arr1, arr2, 3);
printf("%s\n", arr1);
return 0;
}
如果指定的个数大于字符串的个数呢?
int main() {
char arr1[20] = "xxxxxxxxxxxx";
char arr2[] = "world";
strncpy(arr1, arr2, 8);
printf("%s\n", arr1);
return 0;
}
//调试结果表明:当指定的个数大于字符串的个数时,函数会用'\0'补充!
(6)strncmp函数的使用
int main() {
//本函数比较指定的数量的字符
char arr1[] = "hello world";
char arr2[] = "hello";
//只比较前四个字符的结果:
int len = strncmp(arr1, arr2, 4);
printf("%d\n", len);
return 0;
}
(7)strncat函数的使用
int main() {
char arr1[20] = "hello ";
char arr2[] = "world";
//添加指定个数的字符到字符串中:
strncat(arr1, arr2, 3);
printf("%s\n", arr1);
return 0;
}
//如果指定的字符个数大于所在的字符串中的字符个数?
int main() {
char arr1[20] = "hello ";
char arr2[] = "world";
strncat(arr1, arr2, 8);
printf("%s\n", arr1);
return 0;
}
//则会添加字符串中的所有字符,不包括\0。
(8)strstr函数的使用与模拟
本函数的功能用于查找在字符串中另一个字符串
int main() {
//本函数的功能用于查找在字符串中另一个字符串
char arr1[] = "hello world";
char arr2[] = "llo";
//返回要查找的字符串的位置
char* cur = strstr(arr1, arr2);
printf("%s\n", cur);
return 0;
}
模拟:
char* my_strstr(const char * arr1, const char *arr2) {
char* cur1 = arr1; //用于遍历被查找的字符串的指针
char* cur2 = arr2; //用于遍历查找的字符串的指针
char* cur11 = arr1; //用于保存被查找字符串 开始查找位置的指针
//遍历第一个字符串
while (*cur11!='\0') {
//如果当前字符匹配,则继续往下寻找
//*cur2不能够等于'\0'
while (*cur1 == *cur2 && *cur2!='\0' && *cur1!='\0') {
cur1++;
cur2++;
}
//当循环停止或没有进入循环时,有以下几种情况:
//1. 未进入循环或进入循环后,遇到不匹配的字符退出循环
if (*cur1 != '\0' && *cur2 != '\0') {
//此时将cur2指针回归到原来的位置:
cur2 = arr2;
//将cur1指针回到原来的位置后,向后移动一个字符
cur1 = cur1 + 1;
}
// 2.当*cur2等于'\0'时,*cur1等于'\0'或不等于'\0'
if (*cur2 == '\0') {
//此时返回cur11中的值
return cur11;
}
// 3. 当*cur1等于'\0',并且*cur2不等于'\0'时:
if (*cur1 == '\0' && *cur2 != '\0') {
return NULL;
}
cur11++;
}
return NULL;
}
int main() {
//本函数的功能用于查找在字符串中另一个字符串
char arr1[] = "hello world";
char arr2[] = "llo";
//返回要查找的字符串的位置
//char* cur = strstr(arr1, arr2);
//对于本函数的模拟实现
char* cur = my_strstr(arr1, arr2);
printf("%s\n", cur);
return 0;
}
(9)strtok函数的使用
此函数用于将界符设置成\0,并返回界符分割的字符串的首地址
每调用一次本函数,则将字符串按界符切一次,将一个界符置为'\0',返回被切后的字符
串的首地址。
函数需要的参数有被切的字符串与界符组成的字符串
如果一个字符串有多个界符,需要被多次切割,第一次调用函数时,第一个参数需要是指定的字符串地址,而往后调用函数,第一个参数传入NULL即可,(在切割后,函数中会自动报存切割后的信息)。
当字符串切割完毕时,再调用本函数则返回的值为NULL。
举例:
int main() {
//本函数用于获得界符分开的字符串的指针
char arr1[25] = "zezhangyong@name.age";
char * arr2 = ".@";
char* ret = strtok(arr1, arr2);
printf("%s\n", ret);
ret = strtok(NULL, arr2);
printf("%s\n", ret);
ret = strtok(NULL, arr2);
printf("%s\n", ret);
ret = strtok(NULL, arr2);
printf("%s\n", ret);
return 0;
}
设置成循环:
int main() {
//本函数用于获得界符分开的字符串的指针
char arr1[25] = "zezhangyong@name.age";
char * arr2 = ".@";
char* ret = NULL;
for (ret = strtok(arr1, arr2);ret !=NULL ; ret = strtok(NULL,arr2) )
{
printf("%s\n", ret);
}
return 0;
}
(10)strerror函数的使用
在c语言中,当我们使用c语言提供的库函数时,发生某种错误,就会对应相应的错误码,错误码是c语言标准库和不同系统中实现规定的。
在c语言中错误码实现在errno.h文件中:
不同的错误码对应着不同的错误信息,strerror函数正是用来获取错误信息的指针。
本函数的参数是错误码,在c语言程序启动时,便会设置一个errno全局变量记录当前程序的错误码。
//当前文件夹中并没有test.txt文件,现在执行打开文件,会返回NULL值!
int main() {
//打开文件
FILE * p1 = fopen("test.txt", "r");
if (p1 == NULL) {
//errno中的数字对应不同的错误信息。
printf("%s\n", strerror(errno));
}
return 0;
}
结果表明:没有当前文件或文件夹!
perror函数
上面的strerror函数只能够获取错误信息指针,而没有打印功能,
而perror函数可以看做是printf函数与strerror函数的封装,即可以获取错误信息指针,又可以打印。
本函数的参数是错误信息提示,我们可以自己编写。
int main() {
FILE * p1 = fopen("test.txt", "r");
if (p1 == NULL) {
//errno中的数字对应不同的错误信息。
perror("文件错误");
}
return 0;
}