2010-02-14 60 views
4

现在我正在阅读一本关于C的书,并且在书中遇到了一个我无法工作的例子。统计输入中的行数,字数和字符数

#include <stdio.h> 
#define IN 1 
#define OUT 0 
main() 
{ 
    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\n", nl, nw, nc); 
} 

它应该计算输入内的行数,字数和字符数。但是,当我在终端中运行它时,它看起来什么都不做。我是否错过了某些东西,或者这个代码有问题吗?

+0

下面是一个很好的练习:使用switch语句而不是'if's重写代码。结果将是更清晰的代码。使用更长,更具描述性的名称(例如'IN_WORD','charCount','wordCount')也会产生更清晰的代码。 – outis 2010-02-14 09:42:25

+1

通过将实际文件重定向到标准输入而不是控制台I/O来运行代码。例;从命令行输入:myprog Clifford 2010-02-14 11:56:01

+0

如果最后一个字符不是换行符并且文件不为空,则行数应递增1。 – chqrlie 2017-08-15 07:38:10

回答

8

程序仅在输入结束时终止(getchar返回EOF)。在终端上运行时,通常不会发生这种情况,因此看起来程序卡住了。您需要通过在Linux上按Ctrl + D(可能两次)手动关闭输入,或者在Windows的行首(按不同系统可能使用不同的方式)按F6和Enter键来手动关闭输入。

+0

在Windows上从来没有用过F6,虽然我毫不怀疑你是正确的,Ctrl-Z在Windows和MS-DOS FYI上工作,对于神秘的历史CP/M兼容性原因,它被用作EOF字符在MS-DOS上并由Windows继承。 – Clifford 2010-02-14 11:53:51

2

当你运行它时,你需要输入你的文本,按return,然后输入Ctrl-dreturn(没有别的在线)来表示文件结束。似乎与我的简单测试很好地工作。

2

它在做什么是输入一个循环输入。如果输入字符或换行符,则屏幕上不会显示任何内容。您需要中断用作EOF的过程(在我的Mac上,这是CTRL + D)。然后,你会得到结果。

+0

啊,我没有意识到我需要手动停止文件结尾的循环。感谢您及时的回复。 – Pax 2010-02-14 07:37:33

+1

在将问题标记为最佳之前,您应该稍等一会儿。只是一个想法... – 2010-02-14 07:42:38

3

它正在等待stdin上的输入。将文件重定向到其中(myprog < test.txt)或输入数据并按Ctrl-D(* nix)或Ctrl-Z(Windows)。

2

getchar()从标准输入中返回输入。开始输入您想要的字数和行数的文本。当达到EOF时,输入终止,您通过按CTRL D来完成。

CTRL D在此情况下充当传输结束字符。

欢呼

0

我平时处理这种投入是这样的(对于Linux): 1.做一个文件(例如,名为“input.txt中”),键入您的输入和保存 2.使用管道将文本发送到您的应用程序(这里假设你的一个名为“a.out的”,并在当前目录中的应用程序):

cat input.txt | ./a.out 

你会看到该程序运行正常。