无法为 for 循环内的变量赋值

标签 c

这是我想要做的:

  • 从“.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/

相关文章:

c - 理解 C 中的链表

c - 从不兼容的指针类型传递 arg2 'listFind'

c - 动态嵌套循环级别

c - 使用多线程时低于预期的加速

c++ - 有效地处理调用一百万次的 C/C++ 函数

c - 基于菜单的带有 while 和 switch 语句的程序?

C,静态库,链接器: How to give preference to strong symbol over weak symbol

c - 关于指针的困惑

c - 从字符串常量初始化的不适当类型的数组

c - C中的许多TQLI实现是否有错误?