前置知识:
- 数组名是数组的首地址
- 数组第一个元素,也就是下标为0的那个元素也是数组的首地址
char a[10];
char * a;
上面两个的区别:
- 字符数组是一系列变量,在定义或者初始化的时候会逐一确认每个元素的地址,所以,在初始化的时候,可以使用双引号将一个字符串赋值给他,而不能在定义之后的某一行单独使用双引号给他赋值,因为只有第一个元素的地址,而没有后面其他每一个位置的地址
- 字符指针可以访问所有地址,所以在定义之后给他赋值的时候,后续字符的地址也可以被访问到,所以可以在定义之后的某一行直接用双引号将某个字符串赋值给他
第一题:
- 怎么判断字符串某个位置当前字符是数字,小写,大写字母,还是其他的字符? 使用ASCLL码
- 查阅表格,找到对应类型字符所在的数值区间
- 遍历整个字符串
- 创建一个专门用于计数的数组count,有四个元素
- 遍历到一种类型的字符就令他对应count数组的元素加一
- 最终输出四种类型字符数量的结果
#include <stdio.h>
#include <string.h>
int main()
{
char a[10];
char *b;
int count[4] = {0};
scanf("%s",a);
b = a;
for (int i = 0;i < strlen(a); ++i,++b)
{
if (*b >= 48 && *b <= 57)
{
++count[0];
}
else if (*b >= 65 && *b <= 90)
{
++count[1];
}
else if (*b >= 97 && *b <= 122)
{
++count[2];
}
else
{
++count[3];
}
}
printf("number:%d\nbig:%d\nsmall:%d\nother:%d\n",count[0],count[1],count[2],count[3]);
return 0;
}
附加题:
- 使用string.h库中自带的函数strstr()
- 这个函数用来判断某个字符串是否是某个字符串的子串
- 实现strstr()这个函数的方式有两种,一种是普通的暴力枚举,另一种是KMP匹配,由于KMP较为复杂,会另写一篇文章解析
- 普通使用仅需会用strstr()函数即可,不要求掌握实现原理
#include <stdio.h>
#include <string.h>
int main()
{
char *a[3] = {"Martin","Andy","Jordan"};
char b[5] = "ar";
char *d = NULL;
d = b;
for (int i = 0; i < 3; ++i)
{
if (strstr(a[i],d))
{
printf("%s ",a[i]);
}
}
return 0;
}