2014-02-12 72 views
4

所以我只是通過k & r的基本練習。 練習是: 練習1-8。編寫一個程序來計算空白,製表符和換行符。k&r練習1.8結構成員

我試圖創建一個結構與成員空白,標籤換行。 我還編寫了一個init函數來將這些成員設置爲0.

我現在將向您展示源代碼和輸出。

/* 
Exercise 1-8. Write a program to count blanks, tabs, and newlines. 
*/ 

#include <stdio.h> 

typedef struct Counter Counter; 

struct Counter 
{ 
    int blanks; 
    int tabs; 
    int newlines; 
}; 

void initCounter(Counter arg) 
{ 
    arg.blanks = 0; 
    arg.tabs = 0; 
    arg.newlines = 0; 
}; 

int main() 
{ 
    int c; 
    Counter cnt; 
    initCounter(cnt); 

    while((c = getchar()) != EOF) 
    { 
      if(c == ' ') 
      { 
       ++cnt.blanks; 
      } 
      if(c == '\t') 
      { 
       ++cnt.tabs; 
      } 
      if(c == '\n') 
      { 
       ++cnt.newlines; 
      } 
    } 

    printf("\nBlanks: %d", cnt.blanks); 
    printf("\nTabs: %d", cnt.tabs); 
    printf("\nNewlines: %d\n", cnt.newlines); 

return 0; 
} 

這是輸出:

give it another try boom 

Blanks: -416565517 
Tabs: 32768 
Newlines: 1 

任何意見什麼錯? 感謝和問候。

+0

在第1章中,你不應該知道結構ye噸。 –

回答

5
void initCounter(Counter arg) 
{ 
    arg.blanks = 0; 
    arg.tabs = 0; 
    arg.newlines = 0; 
}; 

您需要將指針傳遞給arg。您正在初始化您傳遞給initCounter的結構對象的副本。在C函數中,參數是按值傳遞的。

你的函數原型應該是:

void initCounter(Counter *arg) 
{ 
    /* ... */ 
} 

我讓你做出initCounter身體和initCounter函數調用相應的改變。

3

更改initCounter功能:

void initCounter(Counter* arg) 
{ 
    arg->blanks = 0; 
    arg->tabs = 0; 
    arg->newlines = 0; 
} 

並更改您呼叫的方式:

initCounter(&cnt); 

作爲替代方案,您可以完全刪除此功能,並初始化後聲明cnt

Counter cnt = {0,0,0};