-1
中的平衡圓括號,以便程序打開.c文件並檢查平衡括號,但是我的程序不斷崩潰。我認爲這個問題可能在while
循環中檢查文件中的每個字符。檢查C
typedef struct nodo {
char llave;
struct nodo *sig;
} nodo;
void push(struct nodo **top, int nuevo_dato);
int pop(struct nodo **top);
bool match(char signo1, char signo2);
bool check(FILE *fp);
int main() {
int k;
printf("Seleccionar Opción\n1.Analizar 1\n2.Analizar 2\n3.Analizar 3\n4.Analizar 4\n5.Salir");
scanf("%d", &k);
do {
switch (k) {
case 1: ;
FILE *f1;
f1 = fopen("1.c", "r");
if (check(f1))
printf("Damn");
fclose(f1);
break;
case 2: ;
FILE *f2;
f2 = fopen("2.c", "r");
case 3: ;
FILE *f3;
f3 = fopen("3.c", "r");
case 4: ;
FILE *f4;
f4 = fopen("4.c", "r");
}
} while (k!=5);
}
bool check(FILE *fp) {
int j, i = 0;
char *signo;
nodo *stack = NULL;
signo = malloc(100000);
while (signo = fgetc(fp) != EOF {
if (signo[i] == '{' || signo[i] == '(' || signo[i] == '[')
push(&stack, signo[i]);
if (signo[i] == '}' || signo[i] == ')' || signo[i] == ']') {
if (stack == NULL) {
return false;
}
else if (!match(pop(&stack), signo[i])) {
return false;
}
}
i++;
}
}
bool match(char signo1, char signo2) {
if (signo1 == '(' && signo2 == ')')
return true;
else if (signo1 == '{' && signo2 == '}')
return true;
else if (signo1 == '[' && signo2 == ']')
return true;
else
return false;
}
void push(struct nodo **top, int nueva_llave) {
nodo *nuevo_nodo = (struct nodo*)malloc(sizeof(nodo));
if (nuevo_nodo == NULL) {
printf("Stack overflow \n");
}
/* 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) {
char res;
struct nodo *top;
/*If stack is empty then error */
if (*top_ref == NULL) {
printf("Stack overflow \n");
} else {
top = *top_ref;
res = top->llave;
*top_ref = top->sig;
free(top);
return res;
}
}
「我似乎無法找到問題所在」。使用調試器。它會立即告訴你哪一行代碼觸發了崩潰,然後你可以從那裏進一步調試。 – kaylum
'scanf(「%d」,k);' - >'scanf(「%d」,&k);' – kaylum
'while while(signo = fgetc(fp)!= EOF){'是錯誤的 – BLUEPIXY