我创建了一个非常基本的'调试'程序,用于检查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;
}
答案 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 */
另一种解决问题的方法