想不明白为什么这个程序能正确统计单词个数

mailghyth 2011-05-31 11:18:11
#include <stdio.h>
#define IN 1
#define OUT 0

main()
{
int c,nc,nw,nl,state;
nc = 0;
nw = 0;
nl = 0;
state = OUT;

while((c = getchar()) !=EOF){
++nc;
if(c == '\n')
++nl;
if(c == ' '||c == '\n'|| c == '\t') /*该行开始有 疑惑
state = OUT;
else if(state == OUT){
state = IN;
++nw;
}
}
从上面注释开始没能读懂什么意思,每次while循环的时候遇到空格或换行或制表符都会令state为out,也就是说下面的nw(单词数)会加1,这样的话,如果遇到连续的空格或制表符换行符,nw也自动加1,但是为什么运行的结果却能正确统计单词数呢???
一晚上都没想明白,请多多指教谢谢
...全文
441 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
Athenacle_ 2011-06-02
  • 打赏
  • 举报
回复

if(c == ' '||c == '\n'|| c == '\t')
state = OUT;//如果是以上的三种字符,state为OUT
else //当c不是上面三种字符的时候判断,,这是最关键的
if(state == OUT){
state = IN;
}


LZ应该注意代码风格,也好理解
5t4rk 2011-06-02
  • 打赏
  • 举报
回复
看不明白
就要调试跟踪
慢慢来,就会明白的
jernymy 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yl19870518 的回复:]
c是当前扫描到的字符,
state是当前扫描状态标记:
OUT应该表示当前扫描位置在单词之外(即非字母字符),
IN应该表示当前扫描位置在单词之内
然后再来看下面的代码,应该就好理解了!

if(c == ' '||c == '\n'|| c == '\t')
state = OUT; //当前字符为空格等非字母时,标记state状态为OUT,
else if……
[/Quote]

++
thecityimissed 2011-06-01
  • 打赏
  • 举报
回复
那是一个状态标志,相当于bool类型诶,看不懂再多看几遍撒
pp25210 2011-06-01
  • 打赏
  • 举报
回复

if(c == ' '||c == '\n'|| c == '\t')
state = OUT;
else if(state == OUT){
state = IN;

原因:在读入一个单词的首字符时把一个标志(此程序中是state),设置为0,然后只要state保持为0(或假)后续的非空白字符就不标记为一个单词的开始,到出现下一个空白字符时,必须将此标志重置为1(或真),并且程序准备搜索下一个单词。
lz3771 2011-06-01
  • 打赏
  • 举报
回复
字符分为两种情况,一种是单词内部的有效字符,一种是分隔符。如果有效字符后面跟着分隔符则认为一个单词结束;如果有效字符后面还是有效字符则还没有结束。
AI大龙虾 2011-06-01
  • 打赏
  • 举报
回复
c是当前扫描到的字符,
state是当前扫描状态标记:
OUT应该表示当前扫描位置在单词之外(即非字母字符),
IN应该表示当前扫描位置在单词之内
然后再来看下面的代码,应该就好理解了!

if(c == ' '||c == '\n'|| c == '\t')
state = OUT; //当前字符为空格等非字母时,标记state状态为OUT,
else if(state == OUT){ //当前字符为字母,且之前的state状态为OUT,则应该开始进入单词计数
state = IN; //更改state状态标记为IN,表示现在正在一个单词的内部扫描
++nw; //单词计数+1,注:只有state由OUT变为IN的时候+1,当state持续为IN的时候,因为扫描字符仍在单词内部,所以不计数。
}
mailghyth 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 neolyao 的回复:]

引用 12 楼 mailghyth 的回复:
引用 9 楼 neolyao 的回复:

多看几遍就会明白了!!
The C prohraming language 是本好书!!慢慢啃

啃完,练完理解透,能算扎实的基础吗?

还早的很!!!!
至少还要看c专家编程、c陷阱和缺陷、c和指针
[/Quote]
搞完这基本都是精通拉,日阿
mailghyth 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 shaoxiaojing5193 的回复:]

同学,这个都想一个晚上。。。多做点练习,不懂就问,问了如果懂了就把它牢记,总结,把它彻底的理解掉!否则,还是转专业吧 程序员不适合你。。。
[/Quote]
不好意思,其实我只想拉一小时
如此美丽的你 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mailghyth 的回复:]
引用 9 楼 neolyao 的回复:

多看几遍就会明白了!!
The C prohraming language 是本好书!!慢慢啃

啃完,练完理解透,能算扎实的基础吗?
[/Quote]
还早的很!!!!
至少还要看c专家编程、c陷阱和缺陷、c和指针
pingdan32 2011-06-01
  • 打赏
  • 举报
回复
兄弟不好意思~~~打次也写错了吧????
The C programming language
[Quote=引用 9 楼 neolyao 的回复:]
多看几遍就会明白了!!
The C prohraming language 是本好书!!慢慢啃
[/Quote]
vanterry5 2011-06-01
  • 打赏
  • 举报
回复
额,你不是用getchar吗,每次只读一个字符,即使是连串的空格或者水平制表符,也是一个一个读,每次判断的时候,都是空格。所以不管有多少空格,他当然都会正确判断了。
ps:水平制表符空格的个数是可设置的
biegaoshuwoya 2011-06-01
  • 打赏
  • 举报
回复
看了半天原来是统计单词个数,,,呵呵呵!!
nickowen 2011-06-01
  • 打赏
  • 举报
回复
gdb 程序名字
b XX.PP::line (XX为文件名,line为你的要看的行数) 设置断点
r 运行程序

n为单步调试. p为打印
shaoxiaojing5193 2011-06-01
  • 打赏
  • 举报
回复
同学,这个都想一个晚上。。。多做点练习,不懂就问,问了如果懂了就把它牢记,总结,把它彻底的理解掉!否则,还是转专业吧 程序员不适合你。。。
luolaigen2008 2011-06-01
  • 打赏
  • 举报
回复
gcc 用gdb调试跟踪下呀,调试下就什么都明白了
ww884203 2011-06-01
  • 打赏
  • 举报
回复
这个也想一晚上?只有在不是制表符或者空格的时候才执行else啊
mailghyth 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 z159liao 的回复:]

进VC单步..
[/Quote]
我用的gcc,如何单步阿?不懂
mailghyth 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 neolyao 的回复:]

多看几遍就会明白了!!
The C prohraming language 是本好书!!慢慢啃
[/Quote]
啃完,练完理解透,能算扎实的基础吗?
玩笑 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zouyuncheng 的回复:]
C/C++ code
if(c == ' '||c == '\n'|| c == '\t')
state = OUT;
else if(state == OUT){
state = IN;
++nw;
}

这样也许你会看的清楚一些
[/Quote]
第一个IF与下面的ELSE组成了IF ELSE语句,而后面的IF是ELSE的子语句,也就是说,执行了上面IF下面的state = OUT后,就不会继续执行下面的IF,两者不会同时去判断,,去看一下书上的IF ELSE部分
加载更多回复(10)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧