编写一程序检查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程序括号匹配检查(带详细注释)相关推荐

  1. c语言括号匹配输出个数字,C程序括号匹配检查(带详细注释)

    编写一程序检查C源程序文件中{}.()等括号是否匹配,并输出第一个检测到的不匹配的括号及所对应括号所在的行号(程序中只有一个括号不匹配). 注意: 1.     除了括号可能不匹配外,输入的C源程序无 ...

  2. C源程序括号匹配检查(C语言)

    [问题描述] 编写程序,检查给定的C源程序文件中花括号是否匹配,规定花括号的总个数不超过50个.花括号匹配规则: 1)文件中左花括号"{"个数与右花括号"}"个 ...

  3. OpenCV下的灰度直方图生成及显示的源码,带详细注释

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 注:本文的源码来自博客  http://blog ...

  4. 括号匹配检查c语言,c 语言 检查括号匹配 不能运行 ????

    各位请帮我看一下这个东西, 我要在c语言中实现括号匹配,设计思路:把从链栈中扫描得到的'}',']',')'先存储到动态申请的内存空间中,当扫描到'{','[','('时 在弹出先前存储的')','] ...

  5. android小游戏源码拼图,android编写的数字拼图游戏(带详细注释)

    [实例简介]自己正在学android,编写了一个简单的数字拼图游戏,有详细注释,适合初学者参考使用,比较简单易懂 [实例截图] [核心代码] package com.tsu; import java. ...

  6. 块数据传输程序:将由src单元开始的20个字,转存到由dst开始的单元中(带详细注释)

    利用汇编语言编程实现具有如下功能的程序:将由src单元开始的20个字,转存到由dst开始的单元中.要求:当传输的数据大于8时,采用多数据传输指令一次传递8个数据:对于不足8个单元的数据数据采用单字节传 ...

  7. matlab 流水灯,带详细注释的8led流水灯程序

    /********************************************************************************************* 程序名: ...

  8. 不翻qiang搞定Android Studio Google库加载不下来的问题 打包生成apk android studio 3.2打灰机程序源码带详细注释

    1.Google库加载不下来的问题 其实我们可以给dl.google.com设置个代理,然后库都能正常加载下来了.步骤如下: 打开站长工具网站,http://ping.chinaz.com/dl.go ...

  9. C++ STL 程序员必须会之学会删除容器中的元素 带详细注释实例版本

    //本实例演示容器中各种删除操作的正确玩法 //涉及remove erase remove_if remove_copy unique等函数 #include <iostream> #in ...

最新文章

  1. 资源监控工具Spotlight-使用说明
  2. Howto: 如何将ArcGIS Server缓存移动到新服务器
  3. android下raw目录的作用,Android 之 assets目录和raw目录
  4. 【科普】联邦知识蒸馏概述与思考
  5. Android Track的play流程(三十二)
  6. Redis的数据类型(对象)
  7. Ruby 核心技术与实战 36 讲
  8. 【电脑插入U盘或者内存卡显示无法格式化FAT32如何解决】
  9. C语言实现机器猫绘制
  10. 【elasticsearch】——用ILM策略自动完成冷热数据分离
  11. 【征稿】第三届电子、信息与计算技术前沿国际会议(ICFEICT 2023)
  12. 很经典的十五句话,从别人的blog上看来的!
  13. 中国76个量子比特计算机,再破纪录!中国科学家实现18个量子比特纠缠 为量子计算机奠基...
  14. 怎样用通俗的语言解释REST,以及RESTful?
  15. 三国论(11-15章)
  16. 解释SQL和NoSQL
  17. 怎么把照片的四个角修成圆形?
  18. 淘小宝蚂蚁聊天表情V1.0-V2.0的制作过程
  19. 识别干系人-启动过程组
  20. 无人机机载LiDAR电力线路巡检案例分享

热门文章

  1. m3u8的浏览器播放器
  2. html加载m3u8
  3. 【论文阅读】PSF-LO: Parameterized Semantic Features Based Lidar Odometry
  4. LoRa技术应用场景
  5. 放羊的和砍柴的故事的N种结局
  6. 如何评价阿里云的飞天?
  7. 2021美赛数学建模A题翻译版
  8. html cancel按钮,html:cancel
  9. remind sb to do还是remind sb of doing
  10. odoo14 | 视图报错:没有找到模型:xxx