1.字符分类函数
在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列函数,接下来我们就学习一下这些函数。
C语言中一系列的函数说专门做字符分类的,也就是一个字符是属于什么类型的字符的。
这些函数都是使用一个头文件是:
ctype.h
这些函数的使用方法非常类似,我们就讲解一个函数的事情,其他的非常类似:
int islower(int c);
islower是能够判断参数部分的c是否是小写字母的。
通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0.
#include <stdio.h>
#include <ctype.h>
int main()
{
int ret = islower('A');
printf("%d\n", ret);
return 0;
}
结果:0
#include <stdio.h>
#include <ctype.h>
int main()
{
int ret = islower('A');
if (ret)
printf("小写\n");
else
printf("大写\n");
//printf("%d\n", ret);
return 0;
}
结果:大写
写一个代码,将字符串中的小写字母转大写,其他字符不变。
int main()
{
//a-97
//A-65
char arr[20] = "I am a student";//
int i = 0;
while (arr[i])//字符串最后有\0,当运行到\0后不进入程序
{
if (islower(arr[i]))
{
arr[i] = arr[i] - 32;//变成大写
}
i++;
}
printf("%s\n", arr);
return 0;
}
结果:I AM A STUDENT
2.字符转换函数
C语言提供了2个字符转换函数
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
上面的代码,我们将小写转大写,是用ASCII来完成效果,有了转换函数,就可以直接使用函数来转换。
int main()
{
printf("%c\n", tolower('A'));
return 0;
}
结果:a
那么我们前面的代码就可以换一种方法来写:
int main()
{
//a-97
//A-65
char arr[20] = "I am a student";//
int i = 0;
while (arr[i])//字符串最后有\0,当运行到\0后不进入程序
{
if (islower(arr[i]))
{
//arr[i] = arr[i] - 32;//变成大写
arr[i] = toupper(arr[i]);
}
i++;
}
printf("%s\n", arr);
return 0;
}
结果也是一样的。
接下来,我们后面所学习的都是字符串函数。
3.strlen的使用和模拟实现
size_t strlen ( const char * str )
字符串以‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包含‘\0’).
给定的起始位置开始向后统计\0之前的字符个数
#include<string.h>
int main()
{
char arr[] = "abcdef";
//a b c d e f \0
printf("%d\n", strlen(arr));
return 0;
}
参数指向的字符串必须要以‘\0’结束。
注意函数的返回值为size_t,是无符号的
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abc";
if (strlen(arr2) - strlen(arr1) > 0)
{
printf(">\n");
}
else
printf("<=\n");
return 0;
}
结果:>
因为两个都是size_t的类型,都是无符号的数。
有其他两种写法:
①
if((strlen(arr1)>strlen(arr2)))
②
if ((int)strlen(arr1) > (int)strlen(arr2))
strlen的使用需要包含头文件
学会strlen函数的模拟实现
①计算器
②指针-指针
③递归的方式
//计数器的方式
#include<assert.h>
size_t my_strlen(const char* str)
{
size_t count = 0;
assert(str != NULL);
while (*str)//不能为空指针,需要断言
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
size_t len = my_strlen(arr);
printf("%zd\n", len);
return 0;
}
//指针-指针
#include<assert.h>
size_t my_strlen(const char* str)
{
char* start = str;//将初始位置存入start中
assert(str != NULL);
while (*str)//不能为空指针,需要断言
{
str++;//一直让str++直到遇到\0,
}
return str-start;
}
int main()
{
char arr[] = "abcdef";
size_t len = my_strlen(arr);
printf("%zd\n", len);
return 0;
}
递归:
//递归
//大事化小
size_t my_strlen(const char* str)
{
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
int main()
{
char arr[] = "abcdef";
size_t len = my_strlen(arr);
printf("%zd\n", len);
return 0;
}
4.strcpy的使用和模拟实现
strcpy——string copy-字符串拷贝
char* strcpy(char * destination//目的地, const char * source//源头 );
#include<string.h>
int main()
{
char arr1[] = "hello world";
char arr2[30] = { 0 };
int i = 0;
//把arr1中的内容,拷贝到arr2中
strcpy(arr2, arr1);
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
源字符串必须以‘\0’结束,被拷贝的必须有‘\0’,如果没有‘\0’可能会造成越界访问
会将源字符串中的‘\0’拷贝到目标空间
目标空间必须足够大,以确保能存放源字符串
目标空间必须可修改,常量字符串不可被修改。
#include<string.h>
int main()
{
char arr1[] = "hello world";
char arr2[30] = { 0 };
int i = 0;
//把arr1中的内容,拷贝到arr2中
strcpy(arr2, arr1);
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
学会模拟实现。
//strcpy函数的返回值是char*
//strcpy返回的是目标空间的起始地址
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
char* ret=dest;//存一份起始地址
assert(dest!=NULL);
assert(src!=NULL);
while (*src!='\0')
{
*dest = *src;
dest++;
src++;
//优化
//*dest++=*src++;
}
*dest = *src;//放'\0'.
return ret;
}
//优化:
//char* my_strcpy(char* dest, const char* src)
//{
// while (*dest++=*src++;)
// {
// ;
// }
//}
int main()
{
char arr1[] = "abcdef";
char arr2[20] = { 0 };
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
5.strcat的使用和模拟实现
实现字符串得链接/追加
源字符串必须以’\0’结束。
目标字符串中也得有\0,否则没办法知道追加从哪里开始。
目标空间必须有足够得大,能容纳下源字符串得内容。
目标空间必须可修改。
int main()
{
char arr1[20] = "hello ";
strcat(arr1, "world");
printf("%s\n", arr1);
return 0;
}
strcat的追加方式:
1.找到目标空间中的第一个’\0‘.
2.然后从这个\0的位置开始追加源头字符串
3.源头字符串的内容包括\0都会追加到目标空间
模拟实现:
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
//1.找到目标空间中的\0
while (*dest != '\0')
dest++;
//2.拷贝数据
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello";
my_strcat(arr1, "world");
printf("%s\n", arr1);
return 0;
}