我试图创建一个简单的C程序,当括号“不平衡”时通知用户。但是,结果往往是不正确的。例如,输入{{}}会提示错误语句,而不是“未检测到错误”。任何帮助将不胜感激:)
注意:我是初学者! :)
#include <stdio.h>
main()
{
char filter[100]; // "Filtered" array (contains braces)
char s[100];
int i; // Increment variables
int j;
int z;
int l;
int c;
int linecount = 0;
int pair = 0; // Brace pair {}
int k = 0;
int y = 1;
while (y == 1)
{
linecount++;
for (i = 0; i < 99 && (c=getchar()) != '\n' && c != EOF; i++)
s[i] = c; // Initializing array with a line
if (c == EOF)
break;
for (j = 1; j <= i; j++)
{
if (s[j] == '{'|| s[j] == '}') // Filter extraneous characters
s[j] = filter[k++];
}
if (filter[0] == '{') // Determines if filtered array starts with {
{
for (z = 0, l = (k-1); z < k && l >= 0; z++, l--) //Determine pairs
{
if (filter[z] == '{' && filter[l] == '}')
pair++;
}
if (pair > 0)
printf("No errors detected.\n");
}
else
printf("Line %d: syntactic error.\n", linecount);
}
}
~
答案 0 :(得分:2)
实施&#34;不平衡&#34;更好,更整洁的方式检查是通过使用堆栈。 整个算法可以简化为。
{
将其推入堆栈。}
,即对于每个}
,应该有一个{
如果堆栈为空,则存在一些不平衡的}
答案 1 :(得分:1)
没有必要编写这么复杂的程序。只需使用计数器来计算括号级别。像这样......
/* At the beginning of the file/funciton */
curlyCounter = 0;
/* read characters one at a time in a variable called c */
if (c == '{') curlyCounter++;
if (c == '}') curlyCounter--;
/* at the end of the program or ufnction */
if (c == 0){
/* Correctly formed expression */
} else {
/* Incorrectly formed expression*/
}
这更简单,应该可以解决您的问题。请注意,如果您想要解决其他括号,则需要更复杂的求解器。您将需要递归堆栈实现。
答案 2 :(得分:0)
我首先注意到的是s[j]
位于s[j] = filter[k++]
的左侧。所以s[]
填充了filter[]
其次,由于for(z, l)
从filter[]
的开头迭代到两个变量的结尾,并且它们的值是对称的,所以你仔细检查filter[]
的每个元素。
第三,由于z
和l
的值是对称的,因此只有在大括号的排列如下所示时,此条件才有效:{{{}}}
或{{}}
或{}
,而非{{}}}
或{}}}
。因为即使filter[1] = '}'
和filter[k-2] = '}'
此外,当你到达filter[2] = '}'
(中间的右边)和filter[k-3] = '}'
(中间的左边)时。
编辑:顺便说一句,我说s[]
充满了&#34;空&#34;我认为未定义的元素:因为filter[]
是一个静态数组,如果没有显式初始化,它的元素都被设置为0,至少根据C99标准行为。