C 函数必须计算输入的块数
我是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')
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指针常量,可以是整数,也可以是指针。