C程序括号匹配检查(带详细注释)
编写一程序检查C源程序文件中{}、()等括号是否匹配,并输出第一个检测到的不匹配的括号及所对应括号所在的行号(程序中只有一个括号不匹配)。
注意:
1. 除了括号可能不匹配外,输入的C源程序无其它语法错误;
2. 字符常量、字符串常量及注释中括号不应被处理,注释包括单行注释//和多行/* */注释
3. 字符和字符串常量中不包含特殊的转义字符(\',\")
5. 程序中出现有意义括号的个数不超过200个
不匹配判断规则:
1. 当遇到一个不匹配的右括号(')'或'}')时,输出该右括号及所在行号;
2. 当程序处理完毕时,还存在不匹配的左括号时,输出该左括号及所在行号。
【输入形式】
打开当前目录下文件example.c,查体其括号是否匹配。
【输出形式】
若存在括号不匹配时,应输出首先能判断出现不匹配的括号及其所在的行号。当出现括号不匹配时,按下面要求输出相关信息:
without maching <x> at line <n>
其中<x>为‘{’, ‘}’, ‘(’, ‘)’等符号,<n>为该符号所在的行号。
若整个程序括号匹配,则按下面所示顺序输出括号匹配情况,中间没有空格。
(){(()){}}
【样例输入1】
若当前目录下输入文件example.c中内容如下:
#include<stdio.h>
int main(){
printf("{ hello world }\n"); // }
)
【样例输出1】
without maching ')' at line 4
【样例输入2】
若当前目录下输入文件example.c中内容如下:
#include<stdio.h>
int main(){
printf("{ hello world }d\n"); /* }*/
【样例输出2】
without maching '{' at line 2
【样例输入3】
若当前目录下输入文件example.c中内容如下:
#include<stdio.h>
int main(){
printf("{ hello world }d\n"); /* }*/
}
【样例输出3】
(){()}
【样例说明】
样例1:在注释部分和字符串中的括号不考虑,在将程序处理之后得到的括号序列是(){()),遇到右括号时与最近的左括号匹配,发现最后一个小括号和大括号不匹配。
样例2:处理之后的括号序列是(){(),在最后缺少了右大括号,那么应该输出与之相对应的左括号不匹配。
#include<stdio.h>
#include <stdlib.h>
int main()
{FILE *in;in = fopen("example.c", "r");int line = 1;int error = 0;char stack_bracket[200], bracket[200] , linenum[1000]; //stack 是用来入栈出栈操作的,bracket是用来存储所有的括号的。如果匹配上了最后才用输出bracket int p_to_stack = -1 , p_to_bracket = -1;char temp;int loop = 1;while(loop){temp = fgetc(in);if(temp==EOF) break;else if(temp=='\n') line++;else if(temp=='"') //如果是双引号,则跳过,直到检测到双引号结束 {while(1){temp = fgetc(in);if(temp=='\\') temp = fgetc(in);else if(temp=='"') break;}}else if(temp=='\'') //单引号也跳过,直到检测到单引号结束,但是在程序里面,单引号输入需要用转义字符 \' {while(1){temp = fgetc(in);if(temp=='\\') temp = fgetc(in);else if(temp=='\'') break;}}else if(temp=='/') //出现了这个说明有注释,而且可能有多行注释,所以记得增加行数并且跳过注释 {temp = fgetc(in);if(temp=='/'){while( (temp = fgetc(in)) != '\n' ) ;line++;}else if(temp=='*'){int zhushi = 0;temp = fgetc(in);while(1){if(zhushi) break;while(temp != '*'){temp = fgetc(in);if(temp == '\n') line++;} temp = fgetc(in);if(temp=='\n') line++;if(temp=='/') zhushi = 1;}}}else if(temp=='(') //发现了左括号,入栈,p_to_stack可以记录栈下标序号,然后并且记录下是第几行的左括号 linenum 中下标的地方存储当前行数 {stack_bracket[++p_to_stack] = temp;bracket[++p_to_bracket] = temp;linenum[p_to_stack] = line;}else if(temp=='{'){stack_bracket[++p_to_stack] = temp;bracket[++p_to_bracket] = temp;linenum[p_to_stack] = line;}else if(temp==')'){bracket[++p_to_bracket] = temp;linenum[p_to_stack] = line;if(p_to_stack == -1) //栈为空,说明根本就没有匹配的括号 {printf("without maching '%c' at line %d\n", temp, line);error = 1; //标记有错误,最后由于error不为0 不会输出所有的bracket }else {if( stack_bracket[p_to_stack]=='(' ) {p_to_stack--;}else //虽然栈里面右括号,却不是对应的小括号,所以依然不匹配输出错误信息 {printf("without maching '%c' at line %d\n", temp, line);error = 1;}}}else if(temp=='}'){bracket[++p_to_bracket] = temp;linenum[p_to_stack] = line;if(p_to_stack == -1){printf("without maching '%c' at line %d\n", temp, line);error = 1;}else{if( stack_bracket[p_to_stack]=='{' ){p_to_stack--;}else{printf("without maching '%c' at line %d\n", temp, line);error = 1;}}}else continue;}if(p_to_stack==0) //最后可能剩下左括号,没有匹配上右括号,上面的判断错误都是判断多出来的右括号 {printf("without maching '%c' at line %d\n",stack_bracket[p_to_stack] , linenum[p_to_stack]);error = 1;}bracket[++p_to_bracket] = '\0';if(error == 0) printf("%s", bracket); fclose(in); return 0; }
C程序括号匹配检查(带详细注释)相关推荐
- c语言括号匹配输出个数字,C程序括号匹配检查(带详细注释)
编写一程序检查C源程序文件中{}.()等括号是否匹配,并输出第一个检测到的不匹配的括号及所对应括号所在的行号(程序中只有一个括号不匹配). 注意: 1. 除了括号可能不匹配外,输入的C源程序无 ...
- C源程序括号匹配检查(C语言)
[问题描述] 编写程序,检查给定的C源程序文件中花括号是否匹配,规定花括号的总个数不超过50个.花括号匹配规则: 1)文件中左花括号"{"个数与右花括号"}"个 ...
- OpenCV下的灰度直方图生成及显示的源码,带详细注释
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 注:本文的源码来自博客 http://blog ...
- 括号匹配检查c语言,c 语言 检查括号匹配 不能运行 ????
各位请帮我看一下这个东西, 我要在c语言中实现括号匹配,设计思路:把从链栈中扫描得到的'}',']',')'先存储到动态申请的内存空间中,当扫描到'{','[','('时 在弹出先前存储的')','] ...
- android小游戏源码拼图,android编写的数字拼图游戏(带详细注释)
[实例简介]自己正在学android,编写了一个简单的数字拼图游戏,有详细注释,适合初学者参考使用,比较简单易懂 [实例截图] [核心代码] package com.tsu; import java. ...
- 块数据传输程序:将由src单元开始的20个字,转存到由dst开始的单元中(带详细注释)
利用汇编语言编程实现具有如下功能的程序:将由src单元开始的20个字,转存到由dst开始的单元中.要求:当传输的数据大于8时,采用多数据传输指令一次传递8个数据:对于不足8个单元的数据数据采用单字节传 ...
- matlab 流水灯,带详细注释的8led流水灯程序
/********************************************************************************************* 程序名: ...
- 不翻qiang搞定Android Studio Google库加载不下来的问题 打包生成apk android studio 3.2打灰机程序源码带详细注释
1.Google库加载不下来的问题 其实我们可以给dl.google.com设置个代理,然后库都能正常加载下来了.步骤如下: 打开站长工具网站,http://ping.chinaz.com/dl.go ...
- C++ STL 程序员必须会之学会删除容器中的元素 带详细注释实例版本
//本实例演示容器中各种删除操作的正确玩法 //涉及remove erase remove_if remove_copy unique等函数 #include <iostream> #in ...
最新文章
- 资源监控工具Spotlight-使用说明
- Howto: 如何将ArcGIS Server缓存移动到新服务器
- android下raw目录的作用,Android 之 assets目录和raw目录
- 【科普】联邦知识蒸馏概述与思考
- Android Track的play流程(三十二)
- Redis的数据类型(对象)
- Ruby 核心技术与实战 36 讲
- 【电脑插入U盘或者内存卡显示无法格式化FAT32如何解决】
- C语言实现机器猫绘制
- 【elasticsearch】——用ILM策略自动完成冷热数据分离
- 【征稿】第三届电子、信息与计算技术前沿国际会议(ICFEICT 2023)
- 很经典的十五句话,从别人的blog上看来的!
- 中国76个量子比特计算机,再破纪录!中国科学家实现18个量子比特纠缠 为量子计算机奠基...
- 怎样用通俗的语言解释REST,以及RESTful?
- 三国论(11-15章)
- 解释SQL和NoSQL
- 怎么把照片的四个角修成圆形?
- 淘小宝蚂蚁聊天表情V1.0-V2.0的制作过程
- 识别干系人-启动过程组
- 无人机机载LiDAR电力线路巡检案例分享