2011-07-12 116 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,它警告你這樣的錯誤。