字符和字符串
在介绍这两种函数前,我们先回顾下字符和字符串中较为重要的点:
字符:
我们可以通过键盘上每一个按键输入的内容都可以称为字符(包括数字),用单引号括起来。
字符的特点:
字符在内存中都是以其相应的ASCLL值存储的,ASCLL码的内容较多,记住几个特殊的即可。
- A-->Z: 65-->96
- a-->z: 97-->129
- 小写字母和大写字母可以通过+ 、-32来互相转换
字符串:
由两个及以上的字符组成,用" "括起来。
字符串的特点:字符串默认以\0 结尾。
常用的字符函数:
使用字符函数要包含头文件<ctype.h>
字符分类函数:
字符分类函数使用方法基本类似,熟悉一个后其他字符函数的使用问题就不大了,下面以将小写字母转大写字母为例来介绍判断小写函数islower
其中,islower函数的格式是 int islower (int n),括号内接受一个字符(或其对应的ASCLL值),返回一个整形数;
字符转换函数:
c语言提供了两种字符转换函数,分别是 tolower 和 toupper, 两者功能相对,用法相同,可以一起介绍。
他们的格式如下:
int tolower(int n)//将传入的参数转为小写
int toupper(int n)//将传入的参数转为大写
以下是将字符串里的字符全部转为小写字母的代码实现
#include<stdio.h>
int main
{ int i = 0;
char arr[50] = "abcADNhEj";
int sz = sizeof(arr) / sizeof(arr[0]) - 1; //计算字符串的长度
for (i = 0; i < sz; i++)
{
if (isupper(arr[i])) //先判断是否为大小字母,防止tolower函数对小写字母进行转换,影响程序效率
{
arr[i] = tolower(arr[i]); //如果是大写字母,将其转为小写
}
}
printf("%s", arr);
return 0;
}
字符串函数:
字符串函数是对字符串进行操作的函数,需要包含头文件<string.h>.下面介绍几种常见的字符串函数:
1,strlen函数
size_t strlen(字符串)//传入字符串,并返回字符串的长度
值得注意的是,strlen所计算的长度并不包含末尾的\0,且返回的长度值为无符号整形size_t;
strlen函数的模拟实现
#include<stdio.h>
#include<string.h>
size_t my_strlen(const char * arr)//strlen 的实现
{
int len = 0;
while (*arr)
{
arr++;
len++;
}
return len;
}
int main()
{
int i = 0;
char arr[50] = "abcADNhEj";
my_strlen(arr);
printf("长度为%d\n", my_strlen(arr, sz));
return 0;
}
2,strcpy函数:
const * strcpy(char*arr1,char*arr2)//传入arr1和arr2两个字符串,将arr2的内容拷贝到arr1中,
//返回arr1的首地址
strlen的模拟实现
#include<stdio.h>
//strcpy的模拟实现
char* my_strcpy(char* arr, char* str)
{
char* ret = arr;
while (*str)
{
*arr = *str;
arr++;
str++;
}
return ret;
}
int main()
{
int i = 0;
char arr[50] = "abcADNhEj";
char* str = "qwert";
char * a = my_strcpy(arr, str);
printf("%s", a);
return 0;
}
3,strcat函数
char*strcat(char*arr1,char*str)//函数接收目标字符串arr1和源字符串str的首地址,将str的内容拼接到
arr1字符串zh
//返回arr1字符串的首地址
strcat的模拟实现
#include<stdio.h>
char* my_strcat(char* arr, char* str)
{
char * p_arr = arr;
while (*arr)
{
arr++;
}
while (*str)
{
*arr = *str;
arr++;
str++;
}
return p_arr;
}
int main()
{
int i = 0;
char arr[50] = "abcADNhEj";
char* str = "qwert";
char * a = my_strcat(arr, str);
printf("%s", a);
return 0;
}
4,strcmp函数
int strcmp(char*arr1,char*str)//接收arr1和str两个字符串并进行比较,
//相同返回0,
//前大于后返回1,
//后大于前返回-1
strcmp的模拟实现
#include<stdio.h>
int my_strcmp(char* arr, char* str)
{
while (*str)
{
if (*arr == *str)
{
arr++;
str++;
}
else if (*arr > *str)
{
return 1;
}
else
{
return -1;
}
return 0;
}
}
int main()
{
int i = 0;
char arr[50] = "abcADNhEj";
char* str = "qwert";
int ret = my_strcmp(arr, str);
if (ret == 0)
{
printf("他俩相等\n");
}
else if (ret > 0)
{
printf("前者更大\n");
}
else
{
printf("后者更大\n");
}
return 0;
}
5, strncpy , strncat , strncmp函数
这三个函数的设计只是多了一个参数,用于拷贝、拼接、比较源字符串的n个字符。实现逻辑类似,此处不再说明。
6,strstr函数
char*strstr(char*arr,char*str)//接收目标字符串arr和str,在arr中寻找str,
//若找到,返回arr中存在str的起始地址,
//否则返回空指针
strstr函数的实现
#include<stdio.h>
char* my_strstr(char* arr, char* str)
{
char* first_str = str;
char* move = arr;
while (*str)
{
if (*arr!=*str)
{
move++;
arr = move;
str = first_str;
}
else
{
arr++;
str++;
}
}
return move;
}
int main()
{
//实现strstr
char arr[] = "abcdddefgh";
char* str = "defg";
int sz = sizeof(arr) / sizeof(arr[0]) - 1;
char* my_strstr(arr, str);
printf("%s", my_strstr(arr, str));
return 0;
}