1. 字符分类函数
2. 字符转换函数
3. strlen的使⽤和模拟实现
4. strcpy的使⽤和模拟实现
5. strcat的使⽤和模拟实现
6. strcmp的使⽤和模拟实现
7. strncpy函数的使⽤
8. strncat函数的使⽤
9. strncmp函数的使⽤
10. strstr的使⽤和模拟实现
**明月何时照我还**
在编程的过程中,我们往往会遇见字符和字符串,为了方便我C语言就给我们提供了一系列的函数给我们使用。
接下来我们来一一介绍这些函数
一、字符分类函数
我们使用这些库函数需要包含头文件(ctype.h)
这些函数的使用方法类似,我们就讲解一个作为例子
islower函数是能判断参数部分C是否是小写字母的
1.是小写字母就返回非零的整数
2.不是小写字母就返回0;
我们来练习一下
写一个代码,把小写变成大写,其它字符不变
#include<ctype.h>
int main()
{
char arr [10] = "abcdefEE?,";
int ret = sizeof(arr) / sizeof(arr[0]);
for(int i = 0 ; i<ret ;i++)
{
if (islower(arr[i])) //这里用islower函数判断该字符是不是小写
{
arr[i] = arr[i] - 32; //如果是小写就变成大写,不是则不动
}
}
for (int i = 0; i < ret; i++)
{
printf("%c ", arr[i]);
}
return 0;
}
二、c语言提供了2个字符转换函数
1 . int tolower (int c) : 将参数传进去的大写字母转为小写
2 int toupper (int c ) : 将参数传进去的小写字母转为大写
我们对这两种来分别举例子说明
int main()
{
char arr[15] = "abcdefgGH,.";
int ret = sizeof(arr) / sizeof(arr[0]); //计算数组中的元素个数-
for (int i = 0; i < ret; i++)
{
int c = arr[i];
if (islower(c) != 0) //如果是小写就转为满足条件,进入
{
arr[i] = toupper(c); // 进入之后将小写转换为大写
}
}
for (int i = 0; i < ret; i++)
{
printf("%c ", arr[i]);
}
return 0;
}
int main()
{
char arr[15] = "ABCDEFGJgGH,.";
int ret = sizeof(arr) / sizeof(arr[0]); //计算数组中的元素个数-
for (int i = 0; i < ret; i++)
{
int c = arr[i];
if (isupper(c) != 0) //如果是大写就转为满足条件,进入
{
arr[i] = tolower(c); // 进入之后将大写转换为小写
}
}
for (int i = 0; i < ret; i++)
{
printf("%c ", arr[i]);
}
return 0;
}
接下来的函数是针对字符串的
三、 strlen的使用和模拟实现
作用:计算字符串的大小
#include<string.h>
int main()
{
char a[] = "abcdef./,<>";
unsigned int ret = (unsigned int )strlen(a); //这里需要注意strlen函数的返回值是我无符号的整形
printf("%u ", ret); //打印无符号整形用%u
return 0;
}
strlen函数的模拟实现
1.计数器
int my_strlen(const char* p)
{
int count = 0;
while ((*p) != '\0') //遇见\0停止
{
count++; //不是\0就加1;
p++;
}
return count;
}
int main()
{
char arr[20] = "abcdeffafdsads";
int ret = my_strlen(arr); // 数组名是数组首元素的地址
printf("%d", ret);
return 0;
}
2.指针减去指针
int my_strlen(const char* p)
{
const char * a = p; //先创建一个之指针数组把arr的起始地址储存起来
while ((*p) != '\0')
{
p++; //地址++,直至访问到最后一个字符的地址
}
return(int) (p - a);//指针减去指针是一个数组
}
int main()
{
char arr[20] = "abcdeffafdsads";
int ret = my_strlen(arr); // 数组名是数组首元素的地址
printf("%d", ret);
return 0;
}
四、strcpy函数的使用和模拟
该函数的头文件是(string.h)
#include<string.h>
int main()
{
char a[] = "abcdefddd";
char copy [40] = {0};
char* p = strcpy(copy, a); //strcpy返回的值是复制后字符串的首元素的地址,我们创建一个指针地址来接收
printf("%s\n", p);
p = strcpy(copy,"dsajdjkoajdsjc....");
printf("%s\n", p);
return 0;
}
strcpy函数的模拟实现
#include<string.h>
#include<assert.h>
char* my_strcpy(char* p1, const char* p2) //arr1的数组中的字符串是不能改变的
{
char* p = p1;//先把目标数组的地址储存起来
assert(p1 != NULL); //判断p1和p2是不是数组空地址
assert(p2 != NULL); //包含一个头文件
while ((*p2))
{
*p1 = *p2;
p1++;
p2++;
}
/*while((*p1++ = *p2++))
{
; //这两种方式都可以实现
}*/
return p; //
}
int main()
{
char arr1[] = "afcdasdfassda";
char arr2[40];
char *ret = my_strcpy(arr2, arr1);// 函数的返回值得到的是目标字符串的首地址
printf("%s", ret);
return 0;
}
五、strcat 的使用和模拟实现
5.1
strcat函数的使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[100] = "dajsdasdsakd";//目标字符串的"\0"会被
char arr2[10] = "abcdef"; //会被该字符串的首字符a替代,然后依次放入arr2中
char* p = strcat(arr1, arr2);
printf("%s \n", p);
char arr3[100] = "abcedsd";
char arr4[10] = "gge\0fg"; //提前加上\0
char* p1 = strcat(arr3, arr4);
printf("%s \n", p1);
return 0;
}
5.2
strcat函数的模拟实现
char* my_strcat( char* p1, const char* p2)
{
char* p = p1; //先把目标字符串的首地址给储存起来
//这里我们要先得到目标地址的"\0"出,要在其后链接字符串
assert(p1 != NULL);
assert(p2 != NULL);
while ((*p1))
{
p1++;
}
while ((*p1++ = *p2++))
{
;
}
return p;
}
int main()
{
char arr1[50] = "abcdef";
char arr2[10] = "lkjhgfda.";
char *ret = my_strcat(arr1, arr2);
printf("%s ", ret);
return 0;
}
六、strcmp 函数的使用和实现
比较两个字符串的大小
strcmp 函数的使用
int main()
{
char arr1[10] = "abcefg";
char arr2[10] = "abcefa"; //比的是字符对应的ASCALL的值
if ((strcmp(arr1, arr2)))
{
int a = strcmp(arr1, arr2);
printf("%d\n", a);
printf("arr1大于arr2\n");
}
char arr3[10] = "abcefg";
char arr4[10] = "abcefz";
if ((strcmp(arr1, arr2)))
{
int a = strcmp(arr3, arr4);
printf("%d\n", a);
printf("arr3小于arr4\n");
}
char arr5[10] = "abcefg";
char arr6[10] = "abcefg";
if ((!strcmp(arr5, arr6))) //这里两者相等返回值为0,为假我们加上!才能正常执行
{
int a = strcmp(arr5, arr6);
printf("%d\n", a);
printf("arr5等于arr6\n");
}
return 0;
}
strcmp的模拟实现
int my_strcmp(const char* p1, const char* p2)
{
assert(p1 != NULL);
assert(p2 != NULL);
while ((*p1 == *p2)) //如果相等就继续进入判断,
{
if (*p1 == '\0') //当p1遇见\0就提前截止
{
return 0;
}
p1++;
p2++;
}
return *p1 - *p2;
}
int main()
{
char arr1[50] = "abcdefllg"; //这里是比较我们不必要改变
char arr2[10] = "abcdefllz";
int ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);
if (ret > 0)
{
printf("arr1>arr2");
}
else if (ret < 0)
{
printf("arr1<arr2");
}
else
{
printf("arr1=arr2");
}
return 0;
}
七、strncpy 函数的使用
这个与strcpy 有什么不同呢?
上代码!
int main()
{
char a1[50] = "abcdef";
char a2[10] = "def";
char * p1 = strncpy (a1, a2, sizeof(a2));//复制2个字符
printf("%s\n", p1);
char arr1[50];
char arr2[30] = "i am a student ";
char* p2 = strncpy (arr1, arr2, 5);
printf("%s\n",p2);
return 0;
}
八、strncat的使用
int main()
{
char arr1[50];
char arr2[10];
strcpy(arr1 , "hello "); //可以一起使用实现不同的功能
strcpy(arr2, "i am il;");
char * p =strncat(arr1, arr2, 4); //更加灵活了
printf("%s", p);
return 0;
}
九、strncmp的函数的使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "asdfggh";
char arr2[20] = "asdfggk";
int ret = strncmp(arr1, arr2, 7*sizeof(char));
printf("%d\n", ret);
return 0;
}
十、strstr的使用和模拟实现
作用:
查找子字符串
返回指向str1中str2第一次出现的指针,如果str2不是str1的一部分,则返回空指针。匹配过程不包括结束的空字符,但它到此为止。
int main()
{
char arr[30] = "this is an apple";
char* pr;
pr = strstr(arr, "is");
printf("%s\n", pr);
pr = strstr(arr, "apple");
printf("%s\n", pr);
pr = strstr(arr, "er");
printf("%s\n", pr);
return 0;
}
标签:字符,第十六章,p1,int,arr,ret,char,printf,字符串
From: https://blog.csdn.net/code_whiter/article/details/142059657