C语言统计控制台输入的行数,单词数与字符数:
#include <stdio.h>
#define IN 1 //在单词内
#define OUT 0 //在单词外
/**
*统计输入的行数,单词数与字符数
*/
int main() {
// c:每次读的支付,nl:行数,nw:单词数,nc:字符数,state:标示状态
int c, nl, nw, nc, state
state = OUT
nl = nw = nc = 0
while ((c = getchar()) != EOF) {
++nc
if (c == '\n') {
++nl
}
if (c == ' ' || c == '\n' || c == '\t') {
state = OUT
} else if (state == OUT) {
state = IN
++nw
}
}
printf("%d %d %d", nl, nw, nc)
return 0
}
看这程序定义了3个变量,nc,应该是newchar,也就是新字符的意思。nl
就是new
line,nw就是new
word。其实要想知道一个程序的原理就是带入。假设我们输入了
“an
apple\n”,不包括双引号。很明显这个程序是对字符串主题的每一个字符进行判断的。当c=‘a’的时候,首先++nc,因为这是一个字符;然后因为不是‘\n’,所以行数并不会增加,所以nl++不执行;同理下一句也不会执行。此时因为前两个if都不执行,故执行else,也就是说明当前字符是一个单词内的字母,所以将in置1,并且nw++;意思是目前读到的字母在一个单词内,所以如果下一个字符还是字母的话,就认为是同一个单词内的两个字母,单词数不增加。这样一直读到'an'后面的空格,state就变为out了,说明之前那个单词已经输入完了,现在在这个单词外面。意味着如果下一个字符是字母的话,就是另一个单词的开始,可以nw++。。接下来你应该能理解了吧。。