所以程序应该打开一个.c文件并检查平衡的括号,但是我的程序一直在崩溃。我认为问题可能在arules
循环中检查文件中的每个字符。
while
答案 0 :(得分:0)
您的代码遇到的具体问题:您的push
,pop
和struct 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程序应该通过。
我的总体建议是在您编写代码时进行更多测试 - 不要期望调试已完成的程序。