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

时间:2014-06-23 05:22:43

标签: 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循环内的分配无效。 (当我把它放在循环之外时它正在工作)

我想知道我的代码是否有问题:)。

3 个答案:

答案 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是一项艰苦的工作。