【C语言】统计字符

统计字符

  • 统计字符1
    • 题目描述
    • 思路解析
    • 代码预览
  • 统计字符2
    • 题目描述
    • 思路解析
    • 代码预览

统计字符1

题目描述

要求输入10个字符后,自动统计其中英文字幕、空格或回车、数字字符和其它字符的个数

输入格式

输入为10个字符,最后一个回车代表输入结束,不算在内

输出格式

letter = 英文字母个数 , blank = 空格或回车个数 , digit = 数字字符个数 , other = 其他字符个数

输入样例

aZ &
09 Az

输出样例

letter = 4 , blank = 3 , digit = 2 , other = 1

思路解析

首先我们既然要分类统计那些字符,那么肯定要把他们收集起来

这里的收集方法有很多种,我们依次分析:

  • scanf,最基本和通用的方法,但是除了收集字符的时候都会跳过空格' '和换行\n
  • fgetc,也可以用于从标准输入中收集字符的函数,但是要尽可能保证知道输入的字符个数
  • fgetsgets都是可以用于从标准输入中收集字符串的函数,但是读取时遇到\n就会停止读取。其中gets遇到\n直接存放\0,并且下一次读取会直接忽略遇到的第一个\nfgets在空间充足的情况下会存入\n,也就是说fgets虽然读到了\n后会结束,但是倘若空间充足,也会将\n存放进来

基本上在题目中,个人只推荐从scanffgetsgets中选择使用,选择fgets是因为有些时候gets用不了或者报错

这题是要求我们要能够读取\n的,并且我们也知道字符的总数,那么用scanf是最合适不过的了

因为我们要存储10个字符,因此创建一个大小为11的字符串,用scanf循环10次收集字符,并且在最后给第11个位置放上\0

char str[11];
	for (int i = 0; i < 10; i++) {
		scanf("%c", &str[i]);
	}
	str[10] = '\0';

接下来就是判断,那么我们就写一个循环,直到遇到\0前都不要停就行

for (int i = 0;str[i] != '\0'; i++) {
	}

那么中间的判断怎么写呢?实际上我们倘若知道那些字符分类函数的话,也可以直接用,但我们这里就不用那些库函数了

首先,字符的本质都是ASCII码值,那么我们实际上通过一点简单的判断大小就可以判断字符的类型

但是实际上我们也不用背这张表,我们只要留一个大概印象就可以了,比如我们只要知道1-9a-zA-Z是连着的其实就可以做这一道题了

甚至即使你真的不知道,那么你也可以自己用编译器打印一下看着写

那么实际上知道了怎么判断我们只要把简单的判断语句写出来就行了

if (str[i] == ' ' || str[i] == '\n') {
			blank++;
		}
		else if ((str[i] <= 'Z' && str[i] >= 'A')||(str[i] <= 'z' && str[i] >= 'a')) {
			letter++;
		}
		else if (str[i] >= '0' && str[i] <= '9') {
			digit++;
		}
		else {
			other++;
		}

最后按照格式打印一下即可

代码预览

#include
int main() {
	char str[11];
	for (int i = 0; i < 10; i++) {
		scanf("%c", &str[i]);
	}
	str[10] = '\0';
	int letter = 0;
	int blank = 0;
	int digit = 0;
	int other = 0;
	for (int i = 0;str[i] != '\0'; i++) {
		if (str[i] == ' ' || str[i] == '\n') {
			blank++;
		}
		else if ((str[i] <= 'Z' && str[i] >= 'A')||(str[i] <= 'z' && str[i] >= 'a')) {
			letter++;
		}
		else if (str[i] >= '0' && str[i] <= '9') {
			digit++;
		}
		else {
			other++;
		}
	}
	printf("letter = %d , blank = %d , digit = %d , other = %d", letter, blank, digit, other);
	return 0;
}

统计字符2

题目来源:统计字符(nowcoder.com)

题目描述

输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数。

数据范围:输入的字符串长度满足1≤n≤1000

输入描述:

输入一行字符串,可以有空格

输出描述:

统计其中英文字符,空格字符,数字字符,其他字符的个数

示例

输入:

1qazxsw23 edcvfr45tgbn hy67uj m,ki89ol.\\/;p0-=\\][

输出:

26
3
10
12

思路解析

这道题不需要我们读取\n并且我们不知道输入字符的个数,因此scanf就不好用了

那么实际上我们就可以用gets或者fgets来获取字符串,实现语句如下

	char str[1001];
	//用gets
	gets(str);
	//用fgets
	fgets(str, 1001, stdin);

这里提一点fgets的使用注意事项,以下面代码为例(并且用VS演示)

//假设我们输入的字符串最大为10个字符
int main() {
	char str1[11];
	char str2[11];
	fgets(str1, 11, stdin);
	fgets(str2, 11, stdin);
	return 0;
}

那么当我们想要往str1str2中都装0123456789时,那么理论上我们的标准输入应该如下

0123456789
0123456789

但是实际上我们只输了一段0123456789代码就会结束,那么是为什么呢?我们可以用监视窗口查看一下

【C语言】统计字符_第1张图片

我们可以看到,由于第二个fgets读取到了上一次输入中遗留下来的\n直接结束了

因此,在借用fgets进行多次接收的时候,一定要注意\n,那么解决方案有两种:

  1. 多开辟一个空间装\n,比如最大字符数为100,我们就开辟102个空间
  2. 在后面每一次调用fgets前清理缓冲区中的残留的\n,比如使用一次getchar

实际上判断语句基本上可以抄上面那一题的,只用把判断\n的删掉即可,那么就不再多说了

代码预览

#include 

int main() {
    char str[1001];
    fgets(str, 1001, stdin);
    int letter = 0;
    int blank = 0;
    int digit = 0;
    int other = 0;
    for (int i = 0; str[i] != '\0'&& str[i] != '\n'; i++) {
        if (str[i] == ' ') {
            blank++;
        } else if ((str[i] <= 'Z' && str[i] >= 'A')||(str[i] <= 'z' && str[i] >= 'a')) {
            letter++;
        } else if (str[i] >= '0' && str[i] <= '9') {
            digit++;
        } else {
            other++;
        }
    }
    printf("%d\n%d\n%d\n%d", letter, blank, digit, other);
    return 0;
}

你可能感兴趣的:(c语言,算法,数据结构)