2014-11-25 76 views
1

我正在阅读一本名为C Programming Language 2nd Edition的书。它教导一个称为字符计数的程序。但根据输出它不会。它只是采取字符,什么也不做。 这是第一个版本:C中的行计数器

#include <stdio.h> 
#include <stdlib.h> 

main() { 
    int c, nl; 

    nl = 0; 
    while ((c = getchar()) != EOF) 
     if (c == '/n') 
      ++nl; 
    printf("%d\n", nl); 
} 

所以,当我型我一句,然后按Ctrl+Z满足EOF它给了我零:

I am a good person 
CTRL+Z 
0 

Press any key to return 

它应该计算行和作为一个初学者我可以不明白。

+8

使用' '\ n'',而不是''/ n''。 – Powerswitch 2014-11-25 15:02:02

+2

即使有'\ n'这个程序也不算数字,正在计算**行** – NetVipeC 2014-11-25 15:03:42

+0

只是一个附注,K&R是一本很好的书,但它已经过时了,并且不符合现代C标准。 'main()'应该是'int main()' – toddlermenot 2014-11-25 15:04:41

回答

2

虽然直接的问题是用'\n'替换'/n'的简单情况。 转义n为这是反斜线做什么),你的代码编译和运行的事实换行符是由于C99标准:

6.4.4.4p10:“一个整数字符常量的值包含多个字符(例如'ab')或包含字符或不映射到单字节执行字符的转义序列,是实现定义的。

'/n'字符数组由斜杠和信n的。

一旦你修复了这个问题,你就需要修改字符数,而不仅仅是换行符。

+0

感谢它工作正常,我把/ n而不是\ n。所以我改变它,它的工作 – 2014-11-26 02:42:17

2

显然,执行应该只计算换行符的数量,而不是在if(c=='\n')条件中实现的总字符数。该程序在您的输入中返回0,因为它不包含换行符。

0

可能是程序要知道,如果下一个字符不是线('\n')的末端,所以你将需要:

#include <stdio.h> 
#include <stdlib.h> 

main() { 
    int c, nl; 

    nl = 0; 
    while ((c = getchar()) != EOF) 
     if (c != '\n') 
      ++nl; 
    printf("%d\n", nl); 
} 

这将算字符数,但也有其他转义字符,如'\t',所以我不太确定程序应该做什么,但我认为在你的书中,你会发现一些更多的说明,澄清该部分

计数数的行简单地将'/ n'更改为'\ n',因为您现在可能知道

+0

它应该计算行数。 – mch 2014-11-25 15:06:49

+0

@mch我也很困惑,因为他说“那里教了一个名为字符计数的程序” – 2014-11-25 15:07:49

0

它看起来好像你缺少一套{}括号:

#include <stdio.h> 
#include <stdlib.h> 

main() 
{ 
    int c, nl; 

    nl = 0; 
    while((c = getchar()) != EOF) 
    { // <- This starts the block to be repeated 
     if (c == '\n') 
     { // <- This is just to keep the code 'safe' ... 
      ++nl; 
     } // <- ... as is this 
    } // <- This ends the block to be repeated 
    printf("The number of New Line characters entered was %d\n", nl); 
} 
+1

这不是一个问题在这里,两组括号不是必要的功能。 – mch 2014-11-25 15:14:13

+0

将C转换为LISP ...? (迷失在愚蠢的括号里) – CiaPan 2014-11-25 15:18:10