1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【C语言】分类统计字符个数(多行输入字符串)

【C语言】分类统计字符个数(多行输入字符串)

时间:2022-02-10 04:43:36

相关推荐

【C语言】分类统计字符个数(多行输入字符串)

习题6-1 分类统计字符个数 (15分)本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。

裁判测试样例:

#include <stdio.h>#define MAXS 15void StringCount( char s[] );void ReadString( char s[] ); /* 由裁判实现,略去不表 */int main(){char s[MAXS];ReadString(s);StringCount(s);return 0;}/* Your function will be put here */

输入样例:aZ &09 Az输出样例:letter = 4, blank = 3, digit = 2, other = 1

0~31及127(共33个)是控bai制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

32~126(共95个)是字符(32是空格)

其中48~57为0到9十个阿拉伯数字

65~90为26个大写英文字母

97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

(参考自百度知道)

首先介绍一个算法,关于C语言多行输入网上有诸多🌰,材料《C语言实现在不知道具体行数的情况下实现多行字符串的输入》(/sinat_38205774/)介绍了二维数组的方式来输出:

#include "stdio.h"#include "stdlib.h"#include "string.h"#define N 1000int main(){char str[N][12];int n,i=0;while(gets(str[i])){if(strcmp(str[i],"")==0)//判断如果这个输入的字符串为空则退出{break;}i++;}for(int j=0;j<=i;j++){puts(str[j]); } return 0;}

但是这就出现了问题。因为裁判测试样例中,给出的是一维字符串数组s[MAXS]。上述代码无法套用。因此可以采用getchar() 的方式。getchar()函数一次性只输入一个字符,且换行符也算字符,符合题目要求。

在判断时用ASCII码来判断,这里需要注意的是,回车和换行是不一样的:

符号 ASCII码意义\n 10 换行NL\r 13 回车CR

题目中虽然说的是回车,但实际上需求是将换行包括进去,所以代码中用到的是10而不是13。

完整解法如下:

#include <stdio.h>#include "stdlib.h"#include "string.h"#define N 1000#define MAXS 15char *ReadString(char s[]){for(int i=0;i<MAXS;i++){s[i] = getchar();}return s;}void StringCount(char s[]){int i,letter=0,blank=0,digit=0,other=0;for(i=0;i<=MAXS;i++){if(s[i]>=65&&s[i]<=90||s[i]>=97&&s[i]<=122) letter += 1;else if(s[i]==10||s[i]==32) blank += 1;else if(s[i]>=48&&s[i]<=57) digit += 1;}int n = strlen(s);other = n-letter-blank-digit;printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);}int main(void){char s[MAXS];ReadString(s);StringCount(s);return 0;}

该结果通过测试

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。