c语言输入程序语句,识别函数调用,查找后输出调用函数名及参数名
输出样例
4条回答 默认 最新
- 技术专家团-小桥流水 2022-11-10 16:52关注
需要用到递归,下面是两个测试用例的运行结果:
代码:
#include <stdio.h> #include <string.h> //判断字符串是否是关键词 int isKeyWords(char* p) { char cmd[3][10] = {"if","for","while"}; //过滤系统的关键词 int i = 0; for (; i < 3; i++) { if (strcmp(p, cmd[i]) == 0) return 1; } return 0; } void del(char* p) { int len, flag = 0; int i=0, j; char tmp[100] = { 0 }; int posleft, posright, k, cnt = 0; len = strlen(p); //找到第一个左括号 while (i < len && p[i] != '(') i++; if (i >= len) return; posleft = i; //记录左括号的位置 //找到跟该左括号匹配的右括号) j = posleft+1; while (j < len) { if (cnt == 0 && p[j] == ')') break; if (p[j] == '(') { flag = 1; //表示括号中还有括号 cnt++; } if (p[j] == ')' && cnt > 0) cnt--; j++; } if (j>=len) return; posright = j; //右括号的位置 //从左括号位置,向前方扫描 i--; while (i>=0 && p[i] == ' ') i--;//跳过空格 while (i >= 0 && p[i] != ' ' && p[i] != '+' && p[i] != '-' && p[i] != '*' && p[i] != '/') //这里只考虑了空格和+-*/ i--; //得到左括号与空格、+-*/之间的字符串 for (i = i + 1, k = 0; i < posleft; i++) tmp[k++] = p[i]; tmp[k] = '\0'; k--; //去掉tmp右侧的空格 while (k >= 0 && tmp[k] == ' ') { tmp[k] = '\0'; k--; } if (isKeyWords(tmp) == 0) { //如果不是关键词,说明是函数,则输出 printf("%s ", tmp); //从posleft开始到posright,通过逗号分隔的都是参数 for (k = posleft + 1; k < posright; k++) { if (p[k] == ',') printf(" ");//逗号替换为空格 else if (p[k] == ' ') continue; //忽略空格 else printf("%c", p[k]); } printf("\n"); } //如果括号中包含括号 if (flag == 1) { for (i = posleft + 1, k = 0; i < posright; i++) tmp[k++] = p[i]; tmp[k] = 0; del(tmp); //处理中间部分 } //从右括号右侧开始继续判断 if(p[posright+1] != '\0') del(p + posright + 1); } int main() { char str[1000]; gets(str); del(str); return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥60 pb数据库修改或者求完整pb库存系统,需为pb自带数据库
- ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
- ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
- ¥20 神经网络Sequential name=sequential, built=False
- ¥16 Qphython 用xlrd读取excel报错
- ¥15 单片机学习顺序问题!!
- ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
- ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
- ¥15 相敏解调 matlab
- ¥15 求lingo代码和思路