K& R的输出基本相同

时间:2018-04-27 02:40:30

标签: c

我目前正在通过K& R for C.在第1.5节中,我们基本上创建了一个字数统计程序。代码如下,

#include <stdio.h>

#define IN 1
#define OUT 0

int main()
{
    int c;
    long int nl, nc, nw;
    int state;
    nl = nw = nc = 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;
        }
    }
    printf("\n%ld %ld %ld\n", nl, nc, nw);
}

当我用gcc编译这个程序并打开可执行文件并输入诸如

之类的东西时
Hello
World

我得到输出

1 11 2  

因为我们有1&#39; \ n&#39;换行符,11个字符(包括换行符)和2个单词。有趣的是我什么时候

vim hello.txt 

并输入

Hello
World

然后发出命令

cat hello.txt|./a.out

我得到以下输出

2 12 2 

为什么这个输出与之前不同,因为我所做的只是将文件流式传输到可执行文件中,所以我不明白有什么不同。请解释一下。

谢谢。

2 个答案:

答案 0 :(得分:6)

不是你的程序功能,而是Vim的功能。请参阅:What does the noeol indicator at the bottom of a vim edit session mean?

如果保存时没有,Vim会自动在文件末尾添加换行符。

类型

:set noeol
在Vim中

并再次保存文件,然后你的程序将输出11作为第二个数字。

P.S。 <{1}}使用cat something | program是多余的,只需program < something即可。

答案 1 :(得分:2)

将charactors键入文件并保存后,在文件末尾自动将0x0a添加到文件末尾