用于检查文件内容的程序。有没有更好的办法?

时间:2011-12-07 10:27:12

标签: c arrays if-statement count

我创建了一个非常基本的'调试'程序,用于检查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;
}

4 个答案:

答案 0 :(得分:3)

如果源文件类似于“([]]”,您的程序将报告没有错误,这实际上是非法的。

更好的解决方案是使用stack,这是一种先进先出的数据结构。来自维基百科页面的This section说明了用法。

当您从文件中读取开始符号时,将其推入堆栈。如果它是一个结束符号,则弹出堆栈。如果弹出的符号不是相应的开始符号,则报告不平衡错误。

在文件末尾,如果堆栈为空,则文件中的符号是平衡的。

这是我知道测试符号是否平衡的最常用方法。

答案 1 :(得分:2)

使用switch语句作为与c的比较列表。如果您希望代码更简洁,请使用256个int值的单个数组来存储每个字符的出现次数,并比较{}处的数组值。

答案 2 :(得分: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方法要好得多!

答案 3 :(得分: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 */

另一种解决问题的方法