c语言输入程序语句,识别函数调用,查找后输出调用函数名及参数名
输出样例
需要用到递归,下面是两个测试用例的运行结果:
代码:
#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;
}
这就是字符串拆解呗。参数就是找到小括号对,然后中间用逗号分割出来就是参数列表,函数名就是第一个小括号前到前面第一个不符合函数命名规则的字符或行首之间的字符串。
#include <stdio.h>
#include <string.h>
int check(char c)
{
if(c>='a' && c<='z')
return 1;
if(c>='A' && c<='Z')
return 1;
if(c>='0' && c<='9')
return 1;
if(c=='_')
return 1;
return 0;
}
int main()
{
char s[1000];
char fun[50] = {0};
gets(s);
int lpos = -1;
int f = 0,t;
int len = strlen(s);
for(int i=0;i<len;i++)
{
if(s[i] == '(')
lpos = i;
else if(lpos >= 0 && s[i] == ')') //找到参数表
{
//从lpos向前找函数名
for(int j=lpos-1;j>=0;j--)
{
if(s[j] == ' ' && f == 0) //跳过函数和参数表之间的空格
continue;
if(check(s[j]) == 1) //有效函数字符加入函数名称数组
fun[f++] = s[j];
else
break;
}
for(t=f-1;t>=0;t--)
{
if(fun[t] == 0)
break;
printf("%c",fun[t]);
}
printf(" ");
memset(fun,0,50);
//拆分参数
for(int j=lpos+1;j<i;j++)
{
if(s[j] == ' ')
continue;
if(s[j] == ',')
printf(" ");
else
printf("%c",s[j]);
}
printf("\n");
}
}
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!说的有点抽象了,有没有具体点的题目或者相关案例。