#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#include <stdbool.h>
int main(void)
{
char ch; // 输入的字符
char pre; // 用于保存前一个字符
int n_chars = 0; // 字符数
int n_words = 0; // 单词单词
int n_lines = 0; // 行数
int p_lines = 0; // 不完整不完整函数
_Bool status = false; // 记录单词的标志位
while('|' != (ch = getchar()))
{
n_chars++;
if('\n' == ch)
n_lines++;
if(isalpha(ch) && !isspace(ch) && !status)
{
status = true;
n_words++;
}
if(isspace(ch) && status)
status = false;
pre = ch;
if('\n' != pre)
p_lines = 1;
}
printf(" 字符数:%d\n 行数:%d\n 单词数量:%d\n 不完整行数:%d\n ", n_chars, n_lines, n_words, p_lines);
return 0;
}
在线运行的结果
亮点在于标志位 status 的使用:
首先我们置 status 为false,在检测输入的是字符且非空格且status=false 时,我们计数+1 且将 status=true,再检测下次输入的字符,若下次输入的字符为空格且status = true时,说明一个单词结束(这里status之所以是true,是因为此时status的是前一次输入的字符的判断结果),此时置 status=false
关于字符操作函数需要包含头文件,以及常用字符判断函数如下
字符测试函数,需要包含下面头文件
#include <ctype.h>
函数原型 为真时返回 true,否则为false
isalpha(ch) 字符
isdigit(ch) 数字
isalnum(ch) 字符或数字
isspace(ch) 一切空白字符(1个空格~n个空格,包含换行符)
ispunct(ch) 标点符号
islower(ch) 小写字符
isupper(ch) 大写字符
isgraph(ch) 除空格以外任意可打印字符
isprint(ch) 可打印字符
isblank(ch) 标准空白字符(不包含换行) 不常用
字符映射函数 行为
tolower(ch) 如果是大写字符则返回小写字符;否则,返回本身
toupper(ch) 如果是小写字符则返回大写字符;否则,返回本身