这是我想要做的:
- 从“.c”文件中读取所有字符并将其存储到一个数组中。
- 当该数组中的一个字符为“{”时,它将被压入堆栈。并且推送的字符数将增加 1。
- 当该数组中的一个字符为'}'时,堆栈将弹出,弹出的字符数将增加 1。
- 比较这两个计数以检查是否缺少“{”或“}”
这是我的代码:
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
问题是:
- for 循环内的赋值不起作用。 (当我把它放在循环之外时它起作用了)
我想知道我的代码是否有问题:)。
最佳答案
有几个问题。 让我们一步一步来吧
1) 你的数组初始化循环:
int brackets[limit];
char braces[limit];
for(i = 0; i < 100; i++)
{
braces[i] = 0;
}
您声明了大小为 limit
的数组,但只初始化了 100 个项目。根据函数的参数,将 100 更改为 limit 以完全初始化它。
2)主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
,它从未针对此 block 正确初始化。您所做的是使用一个基本上无处不在的变量(从内存的角度来看,这基本上也没有问题。),但是您依赖于遗留值。这是故意的吗?如果不是,请重新正确初始化 i
。我不得不问这个,因为我无法在代码中阅读您的评论。
令我非常不高兴的是,您在所有循环和语句中完全依赖一个变量。通常不应从内部更改循环索引。也许你可以想出一个更简洁的函数设计,比如在不改变 i
的情况下并行增加的附加索引变量。附加索引将在适当的时候用于数组访问,而 i
实际上仍然只是一个计数器。
关于无法为 for 循环内的变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24358849/