以下是我想要做的事情:
这是我的代码:
int getLinesSyntax(char s[], int limit, FILE *cfile)
{
int i, c, push_count = 0, pop_count = 0;
int state = CODE;
int brackets[limit];
char braces[limit];
for(i = 0; i < 100; i++)
{
braces[i] = 0;
}
for(i = 0; i < limit - 1 && (c = getc(cfile)) != EOF && c != '\n'; i++)
{
s[i] = c;
if(s[i] == '{')
{
braces[0] = s[i];
//push(s[i], braces);
++push_count;
}
else if(s[i] == '}')
{
pop(braces);
++pop_count;
}
}
//Mor shiljih uyed array -n togsgold 0-g zalgana
if(c == '\n')
{
s[i] = c;
i++;
}
s[i] = '\0';
i = i -1; //Suuld zalgasan 0 -g toonoos hasna
if(c == EOF)
{
//just checking
for(i = 0; i < 100; i++)
{
printf("%d", braces[i]);
}
if(push_count != pop_count)
{
printf("%d and %d syntax error: braces", push_count, pop_count);
}
return -1;
}
else
{
return i;
}
}
这是输出
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
问题是:
我想知道我的代码是否有问题:)。
答案 0 :(得分:4)
有几个问题。 让我们一步一步地了解它
1)你的数组初始化循环:
int brackets[limit];
char braces[limit];
for(i = 0; i < 100; i++)
{
braces[i] = 0;
}
您声明大小为limit
的数组,但只初始化100个项目。根据函数的参数,将100更改为限制以完全初始化它。
2)main for循环的条件语句:
i < limit - 1 && (c = getc(cfile)) != EOF && c != '\n'
虽然第一个子语句是正确的,但我有两个评论:
首先(c = getc(cfile)) != EOF
可能是永远不会访问循环的一个原因,但仍然是000000...
。检查文件是否存在,指针不是NULL或发生其他无提示错误。
其次是c != '\n'
。如果出现其中一个字符怎么办?在这种情况下,您不会继续下一次迭代,但会突破整个forloop。将其移除并将其放在身体的第一行,如下所示:
if(c == '\n')
{
i -= 1; // to really skip the character and maintain the index.
continue;
}
3)s[i] = c;
你能确定数组确实是sizeof limit
吗?
4)检查大括号
if(s[i] == '{')
{
braces[0] = s[i];
//push(s[i], braces);
++push_count;
}
else if(s[i] == '}')
{
pop(braces);
++pop_count;
}
您总是分配给braces[0]
,为什么?
5)未初始化的访问
if(c == '\n')
{
s[i] = c;
i++;
}
s[i] = '\0';
i = i -1; //Suuld zalgasan 0 -g toonoos hasna
您现在正在使用函数全局变量i
,它永远不会为此块正确初始化。你所做的就是使用一个基本上在任何地方使用的变量(从内存的角度来看基本上也没问题。),但是你依赖于遗留值。这是出于目的吗?如果不是,请正确重新初始化i
。我不得不问这个,因为我无法用代码阅读你的评论。
我非常不满意的是,你完全依赖于所有循环和语句中的一个变量。通常不应该从内部改变循环索引。也许你可以提出一个更清晰的函数设计,就像你在不改变i
的情况下平行增加的额外索引变量。在适当的情况下,附加索引将用于数组访问,而i
实际上只是一个计数器。
答案 1 :(得分:0)
我认为问题出现在这种情况下&#34; c!=&#39; \ n&#39;&#34;这是在第一行之后,在它到达任何括号之前打破for循环。因此输出。
答案 2 :(得分:0)
对于计算数据中是否存在平衡括号的任务,代码过于复杂。你可以简单地使用:
int l_brace = 0;
int r_brace = 0;
int c;
while ((c = getchar()) != EOF)
{
if (c == '{')
l_brace++;
else if (c == '}')
r_brace++;
}
if (l_brace != r_brace)
printf("Number of { = %d; number of } = %d\n", l_brace, r_brace);
当然,这可能会被代码混淆,例如:
/* This is a comment with an { in it */
char string[] = "{{{";
char c = '{';
在该片段中没有标记控制流语句分组的大括号,因为源代码中有5个左大括号({
)。正确解析C是一项艰苦的工作。