试图创建一个简单的“调试器”(一个简单的C程序)

时间:2014-09-24 03:37:15

标签: c arrays string indices

我试图创建一个简单的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);
        }
}
~

3 个答案:

答案 0 :(得分:2)

实施&#34;不平衡&#34;更好,更整洁的方式检查是通过使用堆栈。 整个算法可以简化为。

  1. 如果您遇到{将其推入堆栈。
  2. 如果遇到&#39;}&#39;检查堆栈是否为空   如果没有,请从堆栈中弹出},即对于每个},应该有一个{   如果堆栈为空,则存在一些不平衡的}

答案 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[]的每个元素。

第三,由于zl 的值是对称的,因此只有在大括号的排列如下所示时,此条件才有效:{{{}}}{{}}{},而非{{}}}{}}}。因为即使filter[1] = '}'filter[k-2] = '}'

,对在最后一种情况下也会增加

此外,当你到达filter[2] = '}'(中间的右边)和filter[k-3] = '}'(中间的左边)时。

编辑:顺便说一句,我说s[]充满了&#34;空&#34;我认为未定义的元素:因为filter[]是一个静态数组,如果没有显式初始化,它的元素都被设置为0,至少根据C99标准行为。

相关问题