2010-01-04 61 views
4

我是一個總C n00b試圖教自己C關K &河我的問題是一種尷尬的初級。好的,這裏是:我無法使用getchar獲得程序來提供我期望的輸出。如果您碰巧碰到了K &,我會被困在練習1.13中。問題是,「編寫一個程序來打印輸入中單詞長度的直方圖」,由於我遇到了這個問題,我甚至無法處理橫向版本。如何使用getchar運行程序?

我在XP上使用Dev-C++(mingW編譯器)並在命令行下運行程序。我的問題是,當我嘗試運行我的程序時,它會等待我輸入要掃描的字符,但是當我完成輸入並按Enter時,它不會執行任何操作。我希望它能夠按照我的預期打印直方圖。實際上,它似乎不計算字長,因爲正如代碼中所見,當我嘗試打印ctr數組中的內容以查看它是否包含任何內容時,什麼都不打印。

我是如此的n00b,我不知道它是我的代碼還是錯誤的命令行。但我懷疑這是系統的問題,因爲當我嘗試編譯並運行a model program時,會發生同樣的情況。輸入輸入,按回車,沒有任何反應。如果我按Ctrl-C,有時它會吐出一個或兩個看起來不像模型輸出的星號。其他時候,它不會做任何事情(只是回到提示)。

這是我的練習代碼。我花了整整一天的時間,質疑我繼續進行編程的能力。我真的很感激,如果有人能讓我擺脫這個漏洞!

另外,我還有一個關於我上面提到的模型程序的問題,但我想我應該在它自己的問題中發佈它。謝謝所有:)

#include <stdio.h> 

//#define 1 IN 
//#define 0 OUT 
int main() { 
    //start w/ state = OUT 
    int c = 0; 
// int state = OUT; 
    int len = 0; 
    int ctr[12]; 
    int i, j; 
    i = j = 0; 

    for (i = 0; i <12; i++) 
     ctr[i] = 0; 
    while ((c = getchar()) != EOF) 
     if (c != ' ' && c != '\t' && c != '\n') { 
//   state = IN; 
      len++; 
      printf("%d", len); 
      } 
     else { 
      ctr[len]++; 
      len = 0; 
      }    
    for (i = 0; i <12; i++) 
     printf("%d\n", ctr[i]); 
    for (i = 0; i <12; i++) { 
     printf("%d\n", i); 
     for (j = 0; j <= ctr[i]; j++) 
      printf("-"); 
     printf("\n"); 
     } 
    return 0; 
} 
+1

與你的問題沒有關係,但考慮拋棄DevC++。它是越野車,不再被開發。一個很好的FOSS替代方案是http://www.codeblocks.org上的Code :: Blocks。但正如我所說的,這與您的問題無關 - 切換IDE不會解決問題。 – 2010-01-04 22:22:27

+0

我有CB一段時間。你不會相信,但是有一段時間我只是不知道如何使用它特別是調試功能:在點擊某個錯誤的按鈕後,它停止向我顯示我的代碼中的錯誤列表。經過幾天的文檔挖掘,我放棄了,回到了唯一一個我知道我的方式的IDE:D – 2010-01-04 22:33:25

+0

Anita,很抱歉聽到這個消息。你有沒有在http://forums.codeblocks.org上詢問你的問題。或者你甚至可以嘗試在SO上發佈一個問題。坦率地說,任何事情都必須比DevC++更好。 – 2010-01-04 23:29:57

回答

7

您的while循環正在尋找代表文件結束而不是行尾的EOF。

在Windows上,您需要鍵入ctrl-z來模擬文件結束。

+0

啊!而已!這些書沒有告訴我這一點。我想知道如果你不來,我最終會學習這個「有趣的事實」。非常感謝! – 2010-01-04 22:04:00

+1

如果您需要與K&R預期相同的行爲,您將受益於在virtualbox中運行Linux:D – 2010-01-04 22:11:25

+0

感謝您的建議!我只是看着virtualbox。我在這裏遇到信息過載的輕度情況。該死的學習曲線。 – 2010-01-04 22:40:17

1

它看起來並不像你實際存儲c(你的輸入)在任何地方......也不打印它。您正在打印字符串的大小,但不是實際的字符。如果你ctr [i] = c;某處(即將字符添加到數組中),然後打印該數組,您將看到您的輸入。哦,是的,關於CTRL-Z的答案也很重要。 此外,如果您完全不熟悉該語言,我強烈建議您在內容的周圍放上括號。在瀏覽代碼並知道什麼會屬於while循環的範圍之前還有一段時間,如果沒有大括號的話,什麼都不會。

+0

恐怕我不太明白你的意思 - 可能是一個釋義吧?謝謝! 如果你正在討論通過數組循環並打印其內容的部分,那麼是的,它實際上是我感興趣的每個單詞中的字符數,而不是單詞本身(練習是打印字長的直方圖)。 – 2010-01-04 22:08:09

+1

啊......我明白了。好了,那麼從我的文章中唯一要拿掉的就是括號裏的東西。而(1){stuff stuff here} ;.在你的例子中,你有一個if/else,跟在沒有括號的地方。老學校C不允許這樣做,但知道C++的現代編譯器不介意。我只是說你應該使用大括號,即使它們不是強制性的,至少在你開始認識這門語言的時候,因爲你會遇到像while(1){do stuff;做更多的東西;} vs. while(1)做足;做更多的東西;。它看起來很相似,但是非常不同。 – 2010-01-04 22:34:59

+0

非常真實。事實上,我昨天花了一個小時追蹤了一個其他的條件,這條條條條條大路(它開始時只有一條語句,但後來沒有添加括號就擴展了)。將從現在開始 - 謝謝:) – 2010-01-04 22:52:57

1

我沒有看到代碼的任何錯誤,所以我在gcc下加載它,它似乎工作正常,只要你記得你必須放入一個EOF(CTRL-D)來終止while循環。我輸入了4行,雖然我無法對答案的正確性作任何說明,但每次按Enter時,我都會得到一系列與我輸入的字符數相等的數字,然後是一個空格。這正是你的代碼所要做的。

當我進入CTRL-D時,我得到了摘要信息。再次,我不會對輸出的正確性做任何表述,但我確實得到了代碼中描述的兩個主要部分。

+0

它確實打印了各種直方圖(帶破折號)?那太棒了。我現在沒有辦法測試我的程序。 另外,我認爲你在Ubuntu上?因爲Windows中的EOF模擬顯然是Ctrl-Z。 – 2010-01-04 22:38:53

+0

是的,它打印了某種直方圖。就像我說的,我甚至沒有嘗試驗證輸出。我的環境實際上是在Windows 7下的Cygwin。安裝開發工具包,你有gcc,gdb等。你甚至可以啓動X服務器並執行GUI。 – jfawcett 2010-01-04 23:35:58