检查C中的平衡括号

时间:2016-09-20 03:05:33

标签: c

所以程序应该打开一个.c文件并检查平衡的括号,但是我的程序一直在崩溃。我认为问题可能在arules循环中检查文件中的每个字符。

while

1 个答案:

答案 0 :(得分:0)

您的代码遇到的具体问题:您的pushpopstruct nodo与他们封装的数据类型不一致,有时候int有时候是char {1}};您的check()函数无法确定signo是字符还是字符串,虽然它返回false,但它永远不会返回true,它应该返回#include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef struct nodo { char llave; struct nodo *sig; } nodo; void push(struct nodo **top, int nuevo_dato); int pop(struct nodo **top); bool match(int signo1, int signo2); bool balanced(FILE *fp); int main() { int k; printf("Seleccionar Opción\n1.Analizar 1\n5.Salir\n"); scanf("%d", &k); FILE *f1; switch (k) { case 1: f1 = fopen("1.c", "r"); if (balanced(f1)) { printf("Balanced!\n"); } else { printf("Unbalanced!\n"); } fclose(f1); break; case 5: return EXIT_SUCCESS; } return EXIT_SUCCESS; } bool balanced(FILE *fp) { nodo *stack = NULL; int signo; while ((signo = fgetc(fp)) != EOF) { if (signo == '{' || signo == '(' || signo == '[') { push(&stack, signo); } else if (signo == '}' || signo == ')' || signo == ']') { if (stack == NULL) { return false; } if (!match(pop(&stack), signo) ) { return false; } } } return true; } bool match(int signo1, int signo2) { if (signo1 == '(' && signo2 == ')') return true; else if (signo1 == '{' && signo2 == '}') return true; else if (signo1 == '[' && signo2 == ']') return true; return false; } void push(struct nodo **top, int nueva_llave) { nodo *nuevo_nodo = malloc(sizeof(nodo)); if (nuevo_nodo == NULL) { fprintf(stderr, "Insufficient Memory!\n"); exit(EXIT_FAILURE); } /* put in the data */ nuevo_nodo->llave = nueva_llave; /* link the old list off the new node */ nuevo_nodo->sig = *top; /* move the head to point to the new node */ *top = nuevo_nodo; } /* Function to pop an item from stack */ int pop(struct nodo **top_ref) { if (*top_ref == NULL) { /* If stack is empty then error */ fprintf(stderr, "Stack underflow\n"); exit(EXIT_FAILURE); } struct nodo *top = *top_ref; int res = top->llave; *top_ref = top->sig; free(top); return res; } 。如果不正确,你的错误处理是不够的。

下面是基本上运行的代码的返工。它没有完成代码,它需要更多的错误检查和其他完成工作(我删除了文件2-4,因为它们对调试不重要,你需要将它们添加回来):

if (signo == '{' || signo == '(' || signo == '[') {

请注意,上面的代码不会将它自己的平衡测试传递给像这样的行:

false

将使平衡逻辑跳闸并返回char arr[3][3] = { { '0', '1', '2' }, { '3', '4', '5' }, { '6', '7', '\0' } }; char* base = &arr[0][0], *a = &arr[0][0]; a = base + 5; printf("base=%d a=%d", base, a); printf("*a = %c ", *a); a = base + 3; printf("row = %s", a); // HERE! 。但是,一个简单的通用C程序应该通过。

我的总体建议是在您编写代码时进行更多测试 - 不要期望调试已完成的程序。