2014-01-23 84 views
0
while ((temp = fgetc(fp)) != EOF) 
    { 

    if(temp == '\n') 
    { 
     chars++; 
     lines++; 
     if((temp = fgetc(fp)) != EOF && (temp == '(' || temp == ')' || temp == '{' || temp == '}')) 
      { 
       chars++; 
       brackets++; 
      } 
     } 
    } 

基本上我想要統計每個(),{}和隨機c文件中的行。這個循環對線條進行計數,但是沒有計算出所有指定的符號。任何想法爲什麼這是?在C中計算特定的字符?

+0

通過失敗,你的意思是返回正確的數值? –

+1

它計數線罰款?如果你連續得到兩條新線? – Kaz

+1

爲什麼不只有一個沒有嵌套的循環,並且從'getc'返回的值開關''來分類字符並更新各種計數。確保變量是'int'類型,以便它可以捕獲值'EOF'。 – Kaz

回答

3

考慮一個簡單的狀態機結構,如:

int ch; 

while ((ch = getc(fp)) != EOF) { 
    switch (ch) { 
    case '\n': 
    chars++; 
    lines++; 
    break; 
    case '(': case ')': /* ... */ 
    chars++; 
    brackets++; 
    break; 
    } 
} 
+0

我沒有看到你的答案,我們相隔幾秒鐘 –

+0

Thanks dude that works very well。 – Vlad

+1

@ user3151488如果您爲此設置添加「當前狀態」變量,則可以將任何常規語言與此相匹配,因爲您可以實現一般DFA(確定性有限自動機),它基本上是當前狀態組合的大開關和輸入符號。例如,你可以計算輸入中有多少C語言標記,或者其他任何東西。:) – Kaz

1
while ((temp = getc(fp)) != EOF) 
{ 
    chars++; 
    if(temp == '\n') 
    { 
     lines++; 
     continue; 
    } 
    if(temp == '(' || temp == ')' || temp == '{' || temp == '}') 
    { 
      brackets++; 
    } 
} 
1
while ((temp = fgetc(fp)) != EOF) 
{ 
    if(temp == '\n') 
     lines++; 
    else if (temp == '(' || temp == ')') // include other brackets 
     brakets++; 

    chars++; // it appears that you want to count them all? 
} 
+0

謝謝,這也可以工作,看起來很簡單:)。順便說一句,如何計數評論字符? – Vlad

+0

@Vlad你是什麼意思的「評論人物」? –