2012-09-26 35 views
0

我是C編程新手,目前我正在教自己如何創建一個C程序,該程序可以對輸入流中的單詞和行進行計數,並將兩個總計輸出到標準輸出。如何計算輸入流中的單詞和行數?

我想要做的是讓程序計算行數並計算輸入流中的字數。我希望程序包含單詞,但要排除空格,製表符,換行符,連字符或冒號。程序輸出結果(單詞和行)爲小數。

#include<stdio.h> 

int main() 
{ 
int iochar; 
int words; 
int lines; 

printf("Enter something here:\n\n"); 

while ((iochar = getchar()) !=EOF) 
    { 
    if((iochar == ' ') || (iochar == '\t') || (iochar == '\n')) 

    putchar(iochar); 
    } 

return 0; 
} 

我想要程序輸出的單詞和行的值在標準輸出中計算的十進制數。這似乎不適合我。

+1

我記得看到這個已經... –

+0

你也沒有計數的代碼。所以顯然不會打印出計數。它也只打印出空白字符,所以你不會看到它的工作。 –

+1

FILE * f = popen(「/ usr/bin/wc」,「w」); while(c = getchar())fprintf(f,「%c」,c); – slugonamission

回答

1

當讀取值爲\n時,您必須遞增lines的值。要計算單詞的數量,您可以看到這些solutions

您還可以使用wc程序(UNIX)...

+0

是的,這正是我使用的Unix系統。 – user1698560

1

嘗試使用switch語句代替if的,並添加一些計數邏輯:

int wordLen = 0; 
while (...) { 
    switch(iochar) { 
    case '\n': 
     lines++; // no "break" here is intentional 
    case '\t': 
    case ' ': 
     words += (wordLen != 0); 
     wordLen = 0; 
     break; 
    default: 
     wordLen++; 
     break; 
    } 
} 
if (wordLen) words++; 

有是K & R第詳細通過本練習,請參見部分1.5.4字數統計

+0

謝謝你,我會測試這個,並讓你知道它是否工作。再次感謝 – user1698560

0

您需要閱讀標準庫函數isspaceispunct;這比對各種字符值進行顯式測試要容易(並且需要考慮到區域設置)。

你需要初始化wordslines爲0,然後更新他們爲你檢查你的輸入:

if (isspace(iochar) || ispunct(iochar) || iochar == EOF) 
{ 
    if (previous_character_was_not_space_or_punctuation) // you'll have to figure 
    {              // out how to keep track 
    words++;           // of that on your own 
    } 

    if (iochar == '\n') 
    { 
    lines++; 
    } 
} 
0

由於AK4749提到的,你沒有任何計數的代碼。

同樣在if語句中,如果它是空格,製表符或換行符,則只會將字符輸出到stdout。我相信你想要的是相反的。

我會嘗試像下面這樣:

#include "stdio.h" 

int main() 
{ 
    int iochar, words,lines; 
    words=0; 
    lines=0; 


    printf("Enter something here:\n\n"); 

    while ((iochar = getchar()) !=EOF) 
    { 
     if((iochar == ' ') || (iochar=='\t')) 
      words++; 
     else if (iochar == '\n') 
      lines++; 
     else 
     { 
      putchar(iochar); 
     } 
    } 
    printf("Lines: %d, Words: %d", lines, words); 
    return 0; 
} 

我沒試過編譯這一點,但它不應該是從確定太遠。

希望它能幫助, Lefteris

+0

謝謝,我試圖編譯該程序,但它似乎可能會返回一些錯誤: – user1698560

+0

第10行:語法錯誤之前或在:int 「program.c」,第27行:警告:函數原型參數必須具有類型 「program.c」,第27行:警告:舊式聲明或不正確的類型:printf 「program.c」,line 27:warning:identifier redeclared:printf current:function()returns int previous:function(const char,...的指針)返回int:「/usr/include/iso/stdio_iso.h」,第206行 「 program.c「,第28行:之前或之後的語法錯誤:return 」program.c「,第28行:警告:語法錯誤:空declar ation – user1698560

+0

你好,我已經更新了代碼塊。我還在更新中包含了以下注釋:初始化「words」意味着我們不能聲明另一個變量(在C中,與C++相反,只能在函數或塊的開頭聲明變量)。新線路的測試也不正確(這是相反的)。我更新了代碼並嘗試編譯它沒有任何問題。 – Lefteris

相關問題