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

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

裁判测试样例:

#include 
#define MAXS 15

void 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语言实现在不知道具体行数的情况下实现多行字符串的输入》(https://blog.csdn.net/sinat_38205774/)介绍了二维数组的方式来输出:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define N 1000
int 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 
#include "stdlib.h"
#include "string.h"
#define N 1000
#define MAXS 15


char *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;
}

该结果通过测试【C语言】分类统计字符个数(多行输入字符串)_第1张图片

你可能感兴趣的:(C语言经典练习,字符串,数据结构,c语言)