【发布时间】:2014-11-18 10:17:25
【问题描述】:
我尝试创建一个简单的 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);
}
}
~
【问题讨论】:
-
正确解析(甚至只是词法分析)C 确实相当具有挑战性。你可能会改进你所拥有的,但是完全正确地完成这项工作是一项大量的工作。
-
您的读取循环从 0 开始存储在
s,但过滤器循环从 1 开始,因此错过了s[0]。 -
谢谢,弗雷德!我改了j = 0,但结果还是不正确。另外,分配 l = (k-1) 是正确的,对吧?因为当 j = i 时,k 将在“过滤器循环”中加一。
-
您确实应该在编译时包含所有警告和调试信息 (
gcc -Wall -g) 并学习如何使用调试器 (gdb)...使用调试器是基本技能。 -
你的程序不是“调试器”,它是parser。