【问题描述】
编写程序,检查给定的C源程序文件中花括号是否匹配,规定花括号的总个数不超过50个。花括号匹配规则:
1)文件中左花括号“{”个数与右花括号“}”个数相等;
2)从文件中头开始顺序查找右花括号“}”的个数,在任何时候均不超过所遇到的左花括号“{”个数。
注意:
1)源程序注释中(/* … */)花括号应被忽略,不参与匹配。
2)源程序中的字符串常量不会出现花括号。
【输入形式】
要检查的C源程序文件名为input.c,在当前目录下。
【输出形式】
若花括号匹配,则向控制台输出1,并在新的一行上输出相应的花括号串;若不匹配,则向控制台输出0,同时在新的一行上输出相应的花括号串。
【样例输入】
假如当前目录下input.c文件的内容为:
#include <stdio.h>
main()
{
int a,b,i,sum1,sum2;
/{input}/
scanf("%d%d",&a,&b);
sum1=sum2=0;
for(i=a;i<=b;i++)
{
if(i%2==0)
{
sum1+=i;
}
else
{
sum2+=i;
}
}
/output}/
printf(“Sum1=%d, Sum2=%d”,sum1,sum2);
}
【样例输出】
1
{{{}{}}}
【样例说明】
源程序input.c中的花括号符合匹配规则,所以先输出1。然后依次输出所有出现的花括号,但注意注释中的花括号不参与匹配,也不输出。
#include<stdio.h>
int main()
{
FILE* f;
f = fopen("input.c", "r");
char c[1000];
int i,count=0,num=0,a[50],x=0,y=0;//x为“{”数目,y为“}”数目,数组a中1代表“{”,-1代表“}”
int flag = 1, k = 0;//k用来判断右边括号是否超过左边
while (!feof(f))
fscanf(f, "%c",&c[count++]);//以字符形式输入
for (i = 0; i < count; i++)
{
if (c[i] == '/' && c[i + 1] == '*')//排除注释中的括号
{
i++;
while (c[i] != '*' || c[i + 1] != '/') { i++; }
i += 2;
}
if (c[i] == '{')
{
k++;
a[num++] = 1;
x++;
}
if (c[i] == '}')
{
k--;
a[num++] = -1;
y++;
}
if (k < 0&&flag==1)//右花括号超过左花括号,判断flag==1即防止不匹配后又对flag的值修改(易忽略)
flag = 0;
}
if (x != y)
flag = 0;
printf("%d\n", flag);
for (i = 0; i < num; i++)
{
if (a[i] == 1)
printf("{");
else
printf("}");
}
fclose(f);
return 0;
}