7. 计算字符的个数
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中 该字符的出现次数。(不区分大小写字母)
数据范围: 1 <= n<=1000
输入描述
第一行输入一个由字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为空 格)。
输出描述:
输出输入字符串中含有该字符的个数。(不区分大写字母) 示例1
输入:
ABCabc
A
输出:
2
思路:
- toupper()和tolower()函数,括号中的类型是单个字符,不是字符串。
- 将字符串中字母都统一转换为小写,遇见与输入字符相同,计数器加一。
具体实现:
#include<stdio.h>
#include<ctype.h>//包含tolower函数的头文件
#include<string.h>//包含strlen函数的头文件
int Number_sum(char ch[], char soal) {
int count = 0;//累加器
char small;//存放字符串转换为小写的字符
soal = tolower(soal);//将单子母转换为小写
for (int i = 0; i < strlen(ch); i++) {//字符串长度与字符串不等于‘\0’是一样的吗?
small = tolower(ch[i]);//j将字符串字母都转换为小写
if (small == soal) {
count++;
}
}
return count;
}
int main() {
char ch[1003],soal{};//定义一个字符串数组ch,单字符soal
printf("输入字符串\n");
fgets(ch,1002,stdin);//读书字符串ch,表示输入的字符上限为n-2(结尾也算一个字符),获取键盘上面的文字。
printf("输入单个字符\n");
scanf_s("%c", &soal,2);//(输入单个字符,获取变量,边界值小于2,即只读取一个)
printf("字符的出现次数:%d\n", Number_sum(ch,soal));
return 0;
}
运行结果:
输入字符串
ABCDEaabcd
输入单个字符
a
字符的出现次数:3
复杂度:
时间:for循环与输入的字符串长度有关,所以时间复杂度为O(n)---n为字符串长度 空间:用到了字符数组,所以空间复杂度为O(m)---m为数组大小
小结:
每天在解决高版本编辑器边界安全问题上越走越远 一,一:
【VS2019/2022】无法使用gets
在VS高版本中使用gets()函数会报错是因为这
个函数不安全,可能会因为读取的字符长度太
长而导致缓冲区溢出甚至程序崩溃,
所以VS会
提醒你使用gets_s函数,也可以使用fgetsQ函数
使用gets_s函数时,最后一个字符必须是'\0',
如果gets_s(str,10)中的第二参数为n,则可以输
入n-1个字符,最后一个字符为结束符八0?
使用fgets(str,,) 函数,第二个参数规定 从输入流中读入几个字符即字符的最大值为多少,注意结尾也算一个字符也不能超过定义的字符数组边界,第三个参数说明读 取哪一个文件,当读取键盘上面的文件时,可 以使用stdin来作为该参数;该函数当遇到换行 符或者读取到第n-1个字符时终止输入。
所以使用fgets()函数更加安全。
有用的知识:
- 数组相当于指向一片内存空间的指针,arr是第一个元素的地址,所以可以说数组本身是地址,加上括号后就相当于指向的空间的值。
arr[0] 指向第一个空间的值,arr[1]指向第二个空间的值。
C语言中一般你如果是字符数组例如char str[5],那么就可以这么打scanf("%s",str);而不用加取地址符 - cpp的编译器是MSVC,像scanf,gets这些io函数他都是不建议使用,因为他认为不安全,所以他自己写了scanf_s,如果你想用scanf得要去编译器里配置忽略这些警告,或者在头部加个宏定义说明说明一下告诉编译器,百度应该能找到
C语言有多个函数可以从键盘获得用户输入,它们分别是:
- scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
- getchar()、getche()、getch():这三个函数都用于输入单个字符。
- gets():获取一行数据,并作为字符串处理。
- scanf() 遇到空格就认为字符串结束了,不再继续读取了
- getline(cin,s):读取一行的字符串,包括空格。
- getchar():读取一个字符,以回车键作为结束标志。
- string a,是字符串类型,可以直接通过数组 a[i] 获取数据。
gets() 和 scanf() 的主要区别是:
- scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
- gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。
- 也就是说,gets() 能读取含有空格的字符串,而 scanf() 不能。