C 函数必须计算输入的块数

C 函数必须计算输入的块数,c,C,我是C编程新手。我的任务是做一个功能,计算从键盘上键入的块数。当块未关闭时,显示错误消息。我试过: const void KeyboardToScreen() { char st[80];int br1 = 0, br2 = 0, j; puts("Enter the code:"); while (fgets(st, 80, stdin) != NULL) { j = 0; while (st[j] != '\0')

我是C编程新手。我的任务是做一个功能,计算从键盘上键入的块数。当块未关闭时,显示错误消息。我试过:

const void KeyboardToScreen()
{
    char st[80];int br1 = 0, br2 = 0, j;
    puts("Enter the code:");
    while (fgets(st, 80, stdin) != NULL)
    {
        j = 0;
        while (st[j] != '\0')
        {
            if (st[j] == '*') br1++;
            j++;
        }
        if (strstr(st, "{") != NULL)
            br2++;
        if (strstr(st, "}") != NULL)
            br2--;
    }
    if (br2 != NULL)
        printf("ERROR: Block is not closed \n");
    printf("%d %d \n", br1, br2);
    exit(0);
};
但是当所有的区块都关闭时,我的计数器“br2”不计算输入了多少区块

    if (strstr(st, "{") != NULL)
        br2++;
如果输入了一个以上的“{”字行,如果发现有任何括号,就会增加,并且不考虑有多少个。

一些建议 每次检查字符串一个字符

int count_braces (const char* s)
{
int n= 0;
while (*s) {
   if (*s == '{')  ++n;
   else if (*s == '}') --n;
}
return n;
}
如果输入了一个以上的“{”字行,如果发现有任何括号,就会增加,并且不考虑有多少个。

一些建议 每次检查字符串一个字符

int count_braces (const char* s)
{
int n= 0;
while (*s) {
   if (*s == '{')  ++n;
   else if (*s == '}') --n;
}
return n;
}

您使用的是
br2
来确保块数对齐,对吗?您使用的方法是在每个开括号中添加一个
{
在每个闭括号中减去一个
}
将帮助您确定是否还有剩余的开括号,而不是计数

我的建议是简单地为每个括号设置一个计数器,并在最后进行比较

e、 g:


重要提示:当您将
strstr()
NULL
进行比较时,这是因为
strstr()
返回指针,如果失败,则返回
NULL
指针。不要将
br2
int
值与
NULL
进行比较,它不是指针。只需检查
if(br2!=0)

您正在使用
br2
来确保块数对齐,对吗?您在每个开放括号中添加一个块的方法
{
在每个封闭括号中减去一个块的方法
}
将帮助您确定是否还有剩余的开放括号,而不是计数

我的建议是简单地为每个括号设置一个计数器,并在最后进行比较

e、 g:


重要提示:当您将
strstr()
NULL
进行比较时,这是因为
strstr()
返回指针,如果失败,则返回
NULL
指针。不要将
br2
int
值与
NULL
进行比较,它不是指针。只需检查
if(br2!=0)

您实际上没有计算输入的块数。正如JDługosz所提到的,您没有考虑一条线上是否有多个块开始

有效代码:

{
  {
    //something
  }
}
{{ /*something*/ }}
同样有效的代码:

{
  {
    //something
  }
}
{{ /*something*/ }}
考虑这一点:

int countAllBraces(常量字符*h,常量字符*n)
{
整数计数=0;
常量字符*tmp=h;
而(tmp=strstr(tmp,n)){
//printf(“位置:%d\n”,(int)(tmp-h));//调试
++计数;
}
返回计数;
}
无效键盘到屏幕()
{
字符st[80];int br1=0,br2=0,j=0,k=0,t;
puts(“输入代码:”);
while(fgets(st,80,stdin)!=NULL)
{
j=0;
而(st[j]!='\0')
{
如果(st[j]='*')br1++;
j++;
}
k+=t=countAllBraces(st,“{”);
br2+=t;
br2-=countAllBraces(st,“}”);
}
如果(br2>0)
printf(“错误:块未关闭\n”);
printf(“%d%d\n”,br1,k);
出口(0);
};

您实际上没有计算输入的块数。正如JDługosz所提到的,您没有考虑一条线上是否有多个块开始

有效代码:

{
  {
    //something
  }
}
{{ /*something*/ }}
同样有效的代码:

{
  {
    //something
  }
}
{{ /*something*/ }}
考虑这一点:

int countAllBraces(常量字符*h,常量字符*n)
{
整数计数=0;
常量字符*tmp=h;
而(tmp=strstr(tmp,n)){
//printf(“位置:%d\n”,(int)(tmp-h));//调试
++计数;
}
返回计数;
}
无效键盘到屏幕()
{
字符st[80];int br1=0,br2=0,j=0,k=0,t;
puts(“输入代码:”);
while(fgets(st,80,stdin)!=NULL)
{
j=0;
而(st[j]!='\0')
{
如果(st[j]='*')br1++;
j++;
}
k+=t=countAllBraces(st,“{”);
br2+=t;
br2-=countAllBraces(st,“}”);
}
如果(br2>0)
printf(“错误:块未关闭\n”);
printf(“%d%d\n”,br1,k);
出口(0);
};

包括您的测试数据。在读取平衡大括号后,br2看起来应该为零。
void
是否允许
const
合格?注意:不要将int(br2)与指针(NULL)进行比较.NULL不是一个通用的零值,而是一个指针。@JDługosz好吧,它是一个空指针常量,可以是整数,也可以是指针。包括您的测试数据。读取平衡大括号后,看起来br2应该为零。
void
是否允许
const
限定?注意:不要比较int(br2)针对指针(NULL)。NULL不是一个通用的零值,而是一个指针。@JDługosz好吧,它是一个NULL指针常量,可以是整数,也可以是指针。