2011-12-07 49 views
2

我創建了一個非常基本的「調試」程序,用於檢查c源文件是否具有相同數量的開始和結束大括號,方括號和括號。我有一個相當簡單的代碼,它的工作原理,但代碼似乎不必要的長。我正在考慮使用數組。一個數組存儲每個{,[,(和另一個存儲},],)然後計數每個實例並比較金額。但我認爲這些代碼幾乎一樣長。你們有什麼感想?檢查文件內容的程序。有沒有更好的辦法?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void) 
{ 
FILE *fp; 
char fname[20]; 
char c; 
int curlybracket = 0; 
int curlybracketr = 0; 
int squarebracket = 0; 
int squarebracketr = 0; 
int parentheses = 0; 
int parenthesesr = 0; 

printf("Please enter the destination of the file: \n"); 
scanf("%s", fname); 
fp = fopen(fname, "r"); 

if (fp == NULL) 
    { 
    printf("Problem opening file!\n"); 
    exit(0); 
    } 

else 
    { 
    printf("File opened correctly\n"); 
    } 

    while (c != EOF) 
    { 
    c = getc(fp); 
     if (c == '{') 
      { 
      curlybracket++; 
      } 

     if (c == '[') 
      { 
      squarebracket++; 
      } 

     if (c == '(') 
      { 
      parentheses++; 
      } 

     if (c == '}') 
      { 
      curlybracketr++; 
      } 

     if (c == ']') 
      { 
      squarebracketr++; 
      } 

     if (c == ')') 
      { 
      parenthesesr++; 
      } 
    } 

    if (curlybracket == curlybracketr) 
     { 
     printf("There are an equal number of curlybrackets\n"); 
     } 
     else 
     { 
     printf("There is an unequal number of curlybrackets\n"); 
     return 0; 
     } 

    if (squarebracket == squarebracketr) 
     { 
     printf("There are an equal number of squarebrackets\n"); 
     } 
     else 
     { 
     printf("There are an unequal number of squarebrackets\n"); 
     } 

    if (parentheses == parenthesesr) 
     { 
     printf("There are an equal number of parentheses\n"); 
     } 
     else 
     { 
     printf("There are an unequal number of parentheses\n"); 
     } 

return 0; 
} 
+1

錯誤:「while(c!= EOF)」你在第一次初始化2行後讀取變量c –

回答

2

使用switch語句比較與c名單。如果您希望自己的代碼更加簡潔明瞭,請使用一個包含256 int值的單個數組來存儲每個字符的出現,並在{}之間比較數組值。

+0

完美我會給予這些鏡頭非常感謝! – adohertyd

0

Count character occurrences in a string

#include <algorithm> 
std::string s = "a(b(c))"; 

int curlybracket = std::count(s.begin(), s.end(), '(') - std::count(s.begin(), s.end(), ')'); 
if(curlybracket == 0) /* coool */ else /* fail */ 

Yust另一種方式來解決這個問題

+0

這是C嗎?我是新手,但從未在 – adohertyd

+0

之前看過這些陳述這是C++。 :) – Matej

3

你的程序,如果源文件是這樣將報告沒有錯誤「([)」,這實際上是非法的。

更好的解決方案是使用stack,它是後進先出的數據結構。來自wikipedia頁面的This section說明了用法。

當您從文件中讀取開始符號時,將其推入堆棧。如果是關閉符號,請彈出堆棧。如果彈出的符號不是相應的開頭符號,則報告不平衡錯誤。

在文件末尾,如果堆棧爲空,則文件中的符號是平衡的。

這是我知道測試符號是否平衡的最常用方法。

+0

是的,我明白你的意思。儘管如此,我還沒有與堆棧合作過,我對C相當陌生。感謝你的支持。 – adohertyd

1

確實,程序可以通過使用數組以更短的方式重寫。它可能看起來像這樣:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void) 
{ 
FILE *fp; 
char fname[20]; 
char c; 
char brackets[6] = "{}[]()"; 
int bracketCounts[6] = {0}; 
char * found; 
int i; 

printf("Please enter the destination of the file: \n"); 
scanf("%s", fname); 

if ((fp = fopen(fname, "r")) == NULL){ 
    printf("Problem opening file!\n"); 
    return 0x00; 
} 

printf("File opened correctly\n"); 

// counting various parentheses 
while ((c = getc(fp)) != EOF){ 
    found = strchr(brackets, c); 
    if (found != NULL) { 
     bracketCounts[found - brackets]++; 
    } 
} 

// dont't forget to close file after reading is done 
fclose(fp); 

// checking parentheses counters 
for (i=0; i < 6; i+=2) { 
    if (bracketCounts[i] != bracketCounts[i+1]) { 
     printf("Unbalanced parentheses !\n"); 
     return 0x00; 
    } 
} 

printf("All parentheses are OK!\n"); 

return 0x00; 
} 

但是它很容易出錯,就像@lbs提到的那樣,使用@lbs方法會好得多!

相關問題