版权声明:可以转载奥 https://blog.csdn.net/Jiajikang_jjk/article/details/84332836
C语言实现字符(单词)个数的统计
一、说明
1、博主使用的是VS Code编辑器,
2、cmd下运行文件
3、winds10系统
二、程序思路分析
目的:统计单词
伪代码分析:
1:读取一个字符
2:当有更多输入时:
a:递增字符计数
b:如果读完一行,递增行数计数
c:如果读完一个单词,递增单词计数
3:读取下一个字符
细化分析:
1:识别单词处理
问题:定义what来作为程序识别的单词
解答:将一个单词定位为不含空白(空白:空格、制表符、换行符)的字符序列
2:查找具体一个单词中是否含有某个字符
A: 程序读取一个单词
B: 首字符作为一个标记(inword)设置为 1 (也可以在此时递增单词计数)
C:只要inword为1,后面的非空白字符都不记为单词的开始
D: 读到空白字符时,inword重置为0,然后程序读取下一个单词
伪代码分析:
c: 空白字符
如果 c 不是空白字符,且inword为假:
设置inword为真,且给单词计数
如果 c 是空白字符,且inword为真:
设置inword为假
三、代码展示
/*
目的:统计单词
伪代码分析:
1:读取一个字符
2:当有更多输入时:
a:递增字符计数
b:如果读完一行,递增行数计数
c:如果读完一个单词,递增单词计数
3:读取下一个字符
细化分析:
1:识别单词处理
问题:定义what来作为程序识别的单词
解答:将一个单词定位为不含空白(空白:空格、制表符、换行符)的字符序列
2:查找具体一个单词中是否含有某个字符
A: 程序读取一个单词
B: 首字符作为一个标记(inword)设置为 1 (也可以在此时递增单词计数)
C:只要inword为1,后面的非空白字符都不记为单词的开始
D: 读到空白字符时,inword重置为0,然后程序读取下一个单词
伪代码分析:
c: 空白字符
如果 c 不是空白字符,且inword为假:
设置inword为真,且给单词计数
如果 c 是空白字符,且inword为真:
设置inword为假
*/
#include <stdio.h>
#include <ctype.h> // 字符函数--提供了一系列专门处理字符的函数
#include <stdbool.h> // bool,true,false提供定义
#define STOP '|' // 作为末尾标识
// 主函数
int main(void)
{
char c; // 读入字符
char prev; // 读入的前一个字符
long n_chars = 0L; // 字符数
int n_lines = 0; // 行数
int n_words = 0; // 单词数
int p_lines = 0; // 不完整的行数
bool inword = false; // 如果c 在单词中,inword=true
printf("请输入要分析的文本(|或终止):\n");
prev = '\n'; // 用于识别完整的行
while ((c = getchar()) != STOP)
{ // 当输入的字符非|时进行如下操作
n_chars++; // 统计字符数
if (c == '\n')
{ // 当输入的字符是换行符时进行如下操作
n_lines++; // 统计行数
}
if (!isspace(c) && !inword)// ------------- 有个问题
{ // !isspace()非空白字符且!inword为true时进行如下操作
inword = true; // 开始一个新的单词
n_words++; // 统计单词个数
}
else if (isspace(c) && inword)
{
inword = false; // 达到单词的末尾
}
prev = c; // 保存字符的值
}
if(prev != '\n'){ // 如果不是换行符
p_lines = 1; // 设置起始行为 1
}
printf("字符个数 = %ld,单词数 = %d,行数 = %d",n_chars,n_words,n_lines);
return 0;
}
四、结果
五、结果分析
得出结果之后,其实发现此程序还要进一步完善,有个问题:要是用户输入的单词之间有多个空格会是个什么结果。这个问题在代码中没有进行一个处理所以统计的结果博主大胆猜测可能多余空格都会进行作为字符个数进行计算的。
So,,,有待完善!!!