2011-07-12 89 views
1

我是C的初学者,我购买了“C语言程序设计”一书,并开始阅读并完成它所说的一切。书中有一个代码应该列出句子的行数,字数和字符数。这是本书的代码。程序不打印数字

#include <stdio.h> 
#define IN 1 /* inside a word */ 
#define OUT 0 /* outside a word */ 


/* count lines, words, and characters in input */ 
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); 
} 

出于某种原因,应该用printf打印出的值没有显示出来。我真的不知道什么是错的。如果将printf放在while循环中,它只会打印出数字,但这不可能是正确的,因为每次值更改时都会打印数字。

+1

它看起来对我很好。如果将它放入调试器并在printf上放置一个断点并等待它达到,会发生什么情况。是否有可能printf正在执行,然后命令窗口在你真正看到输出之前关闭?尝试在printf之后添加一个getchar()。 –

+4

请注意,您已写入c ='\ t'而不是c =='\ t'。 –

+0

这肯定是本书的一个错字。我也在printf后面放了一个getchar(),但没有任何反应。 – captain

回答

3

你在这一行一个错字 - 的c = '\t'分配结果始终为true

if (c == ' ' || c == '\n' || c = '\t') 

要修正,更改=到==

if (c == ' ' || c == '\n' || c == '\t') 

要回答你的问题为什么它不打印任何东西 - 我认为编译器要么给你的错误或警告导致程序不被链接,因此你实际上并没有编译列出的源代码,而是你正在运行一个旧的v删除之前编译的任何代码。

+0

这正好说明了为什么我们许多人会这样写:'if(''== c ||'\ n'== c ||'\ t'== c)' - 如果您不小心误输入比较作为一个任务,你会得到一个编译器错误。当然,如果(isspace(c))'会更好。 –

+0

正确但难以阅读,因为它不是我们会说的方式。大多数编译器(比如gcc的现代版本)都会给出警告。 – Soren

+0

我发现它起初有点刺耳,但几周后就消失了。就个人而言,我更喜欢某种编译器可以随时使用某些编译器的某些版本的东西,但即使使用它们也可以禁用它们。 –

1

GCC给出一个编译错误,在这条线:

if (c == ' ' || c == '\n' || c = '\t') 

期待@这一行,很容易发现一个错字:c = '\t')

缺少平等的测试,不是吗? :)

1

它看起来像你正在从STDIN(键盘)读取你的输入,只留下“文件结束”循环,这不会发生。按照其他答案的建议。

0

除了其他人提到的错字,您需要发送一个文件结束信号来结束输入循环。这取决于你正在运行它的环境 - 在Windows中是Ctrl + Z,而在* NIX环境中应该是Ctrl + D。我需要在一个新行上输入它,然后在使用我通常的IDE(Code :: Blocks)时按Enter键。

What it looks like

别忘了,在时间k & R(1 & 2)写,命令行程序是常态,通常你所期望的输出是可见的,如果你刚刚结束程序。有些IDE将在节目结束时关闭他们的终端模拟器,然后才能查看结果,所以你可能需要像

printf("\nPress return to continue"); 
getchar(); 

在节目的末尾添加一些东西。或者,您可以从OS终端仿真器(在Windows上使用cmd.exe,或者gnome-terminal,yakuake或您的操作系统提供的任何软件)自行运行它。导航到该文件夹​​并

your_executable.exe 

./your_executable 
+0

如果您确实需要这样做,您可能实际上必须添加第二个getchar(),因为在流中可能会存在换行符char – thelionroars1337

0

这是一个平等的问题,因为上面if (c == ' ' || c == '\n' || c = '\t')指出。 我建议你使用一个好的IDE,如Eclipse CDT,它警告你这样的错误。