题外话>代码不够完善自行判断借鉴,有错误欢迎uu们指正
内容一:统计字符串中指定字符出现的次数
单引号/双引号:
单引号 ‘ ‘ :在字符常量时使用,表示单个字符。
例 :char c = ‘a’;
char c = ‘1’;
双引号 ” “ :在表示字符串常量时使用,可以表示0到多个字符组成的字符串。
例 :char c[ ] = “A”;
char c[ ] = Oi”;
char *c = “Oi”; //指针形式
Tryone:已知字符串求字符出现字数
例如给一段字符串”abcdefgabcabcdefgabc”, 我们想要知道a这个字符的出现次数,我们只需将已知字符串放入数组中,再通过for循环遍历数组每个元素中是否为字母a,是就定义一个变量使其加1,具体代码如下:
#include <stdio.h>
void main()
{
int i,a=0;
char arr[20]="abcdefgabcabcdefgabc";
for(i=0;i<20;i++)
{
if(arr[i]=='a')
a=a+1;
}
printf("a的个数有:%d个",a);
}
代码运行结果如下:
这个代码的不足点在于我们需要通过改变代码本身内容来更改想计算的字符串,于是用到了函数
scanf( ); //输入函数,通过键盘输入对变量进行赋值
Trytwo:输入字符串求字符串出现次数
具体代码如下:
#include <stdio.h>
void main()
{
int i,a=0;
char arr[10];
printf("输入你查询的字符串:");
for(i=0;i<10;i++)
{
scanf("%c",&arr[i]);
}
for(i=0;i<10;i++)
{
if(arr[i]=='a')
a=a+1;
}
printf("a的个数有:%d个",a);
}
代码运行效果如下:
此时我们多发现了两个问题,
Q1:如何随意的打一段字符串都可以存储到数组中并进行计算次数?(10个不够存,100存不满)
Q2:如何不通过改变源程序方法改变指定字符的内容?(除了a,有时候还想查询b)
由这两个问题于是就引出了内容二
Trythree:输入字符串求输入字符的出现次数(待补充)
内容二:统计字符串中26个字母出现的次数
回归内容一的第二个问题,我寻思,那直接把二十六个字母都打出来不就好了吗嫩麻烦。
具体代码
#include <stdio.h>
#include <math.h>
#include <string.h>
void main()
{
int i,a=0,c,j;
char arr[100]; //根据存储空间定下标
char numb[26]={}; //用来存储26个字母的出现次数
for(i=0;i<100;i++)
{
scanf("%c",&arr[i]);
if(arr[i]=='\n')
{
break;
}
}
for(i=0;i<100;i++)
{
if (arr[i]=='\0')
{
i++;
}
else if(arr[i]>='a' && arr[i]<='z')
{
int c=arr[i];
//printf("%d\n",c);
numb[c-97]+=1;
//printf("%d\n",numb[c-97]);
}
else if(arr[i]>='A' && arr[i]<='Z')
{
int c=arr[i];
//printf("%d\n",c);
numb[c-65]+=1;
//printf("%d\n",numb[c-65]);
}
}
for(j=0;j<26;j++)
{
printf("%c/",j+65);
printf("%c",j+97);
printf("有%d个\n",numb[j]);
}
}
转义字符
介绍几个有特殊含义的字符:
① ‘ \n ‘ : 回车换行 //在语句中,则出现在下一行的同一位置
② ‘ \r ‘ : 回车 //在语句中,则回到当前行的行首,输入会覆盖当前行原有内容
③ ‘ \0 ‘ : 字符串结束符
对代码的理解
if(arr[i]==’\n’)
{break;
}
在原有的输入函数语段中加入了一个if的判断语段,定义的数组元素有100个,正常输入如果没有满100个元素不会跳出输入的for循环,通过判断是否有换行符(打完字符串按下回车),如果有,就通过break跳出for循环,就可以只存储输入的一段字符串;
if (arr[i]==’\0′)
{
i++;
}
在尝试输入句子的时候,发现了一个小bug,一开始我使用的是 if (arr[i]==’ ‘) ,但是输出的结果也有问题。
我的想法是,因为输入是char的数据类型,char是存储字符的,就例如
I love you baby
“love”后的空格代表”love”这一段字符串的结束, 于是考虑用 ‘ \0 ‘ 。
核心语段:
if(arr[i]>=’a’ && arr[i]<=’z’)
{
int c=arr[i];
numb[c-97]+=1;}
是先判断字符是否为 ‘a’ ~ ‘z’,然后通过int的方式强行将char数字类型转化为int的数字类型,根据ASCII真值表可知, ‘a’ ~ ‘z’的ASCII值是97~122 ,所以通过 numb[c-97] 的方式可以将 ‘a’ ~ ‘z’出现的次数有序的记录到 numb[0]~numb[26],出现次数不区分大小写,大写字母的判断思绪与小写字母一致
运行效果
注:此代码还有个无法判断标点符号和特殊符号的小bug未完善
版权声明:本文为博主作者:樂屿原创文章,版权归属原作者,如果侵权,请联系我们删除!
原文链接:https://blog.csdn.net/weixin_70754287/article/details/133936903