1.字符分类函数
*ctype.h
在ctype.h中
*简单使用
cplusplus对ctype.h的介绍 点我跳转
以islower为例,需要它的返回值来判断
格式islower('字符');
翻译:如果c确实是小写字母,返回一个不是0的值,否则返回0
如
#include <stdio.h>
#include <ctype.h>
int main()
{
int ret=islower('a');
printf("%d",ret);
return 0;
}
*例题
将字符串的所有小写字母转大写字母
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
int main()
{
char arr[200] = { 0 };//最大199个字符,留一个给\0
scanf("%s", arr);
for (int i = 0; i < 200; i++)
{
if (islower(arr[i]))
{
arr[i] -= 0x20;
}
if (0 == arr[i])
{
break;
}
}
printf("%s", arr);
return 0;
}
2.字符转换函数
*格式
int tolower ( int c ); //将参数传进去的大写字母转小写,否则无动作
int toupper ( int c ); //将参数传进去的小写字母转大写,,否则无动作
显然tolower和toupper自动带判断大小写
因此上方的代码还有第二种写法
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
int main()
{
char arr[200] = { 0 };//最大199个字符,留一个给\0
scanf("%s", arr);
for (int i = 0; i < 200; i++)
{
//返回值传给arr[i],不可直接写成toupper(arr[i]);这样返回值传不了!!!
arr[i]=toupper(arr[i]);
if (0 == arr[i])
{
break;
}
}
printf("%s", arr);
return 0;
}
3.字符串函数
先包含头文件string.h
*strlen
20.5.【C语言】求长度(sizeof和strlen)的两种方式 点我跳转
在上方给的文章的基础上延伸
strlen:从给定的位置开始,向后统计\0以前的字符个数
如stlren(arr+1);从arr[1]开始,向后统计\0以前的字符个数
*例题(易错)
求下列代码的运行结果
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = { "abcdef" };
char arr2[] = { "abc" };
if (strlen(arr2) - strlen(arr1) > 0)
{
printf("正数");
}
else
{
printf("负数或0");
}
return 0;
}
意料之外输出正数?!
分析:
之前讲过strlen返回类型为size_t为无符号整数
3-6=-3,但计算机按无符号整数理解,也就不存在符号位,为正
如果要比较字符串的大小如何改进?
改法1
if (strlen(arr2) > strlen(arr1) )
改法2强制类型转换
if ((int)strlen(arr2) > (int)strlen(arr1) )
4.模拟实现strlen函数
三种方法
01.用指针遍历
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
size_t sim_strlen(char* str)
{
size_t CX = 0;
while (*str)//如果解引用后不为\0则执行循环
{
str++;//指针移动
CX++;//计数
}
return CX;
}
int main()
{
char arr[200] = { 0 };//最多199个字符,留一个给\0
scanf("%s", arr);
size_t sum = sim_strlen(arr);
printf("%zd", sum);
return 0;
}
02.指针-指针
指针-指针是指针之间的元素个数,则返回指针-指针即可
对上方的代码稍作修改
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
size_t sim_strlen(char* str)
{
char* begin = str;
while (*str)//如果解引用后不为\0则执行循环
{
str++;//指针移动
}
return str-begin;//返回指针-指针,即指针之间的元素个数
}
int main()
{
char arr[200] = { 0 };//最多199个字符,留一个给\0
scanf("%s", arr);
size_t sum = sim_strlen(arr);
printf("%zu", sum);
return 0;
}
03.递归
递归复习见:35.【C语言】详解函数递归
sim_strlen的递归过程:
转为代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
size_t sim_strlen(char* str)
{
//一定注意是\0不是字符0!!!!!!
if (*str == '\0')
{
return 0;
}
else
{
return (1 +sim_strlen(str+1));
}
}
int main()
{
char arr[200] = { 0 };//最多199个字符
scanf("%s", arr);
size_t sum = sim_strlen(arr);
printf("%zu", sum);
return 0;
}
在if判断处,一定注意是\0不是字符0!!!!!!