Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何计算函数中的行数_C_Perl - Fatal编程技术网

C 如何计算函数中的行数

C 如何计算函数中的行数,c,perl,C,Perl,我需要计算文件中函数的行数。 我有以下输入 投入: 文件名 函数名 所需输出: 函数中的行数 例如: int main() { line1; line2; line3; } int func() { line1 line2 line3 line4 line5 if(---) //line 6 { //line 7 line 8 line 9 }

我需要计算文件中函数的行数。 我有以下输入

投入:

  • 文件名
  • 函数名
所需输出:

  • 函数中的行数
例如:

int main()
{
    line1;
    line2;
    line3;
}
int func()
{
    line1
    line2
    line3
    line4
    line5
    if(---)  //line 6
    {        //line 7
        line 8
        line 9
    }        //line10
}
因此,如果我们将文件名和函数名传递为“func”,那么上面的示例应该返回10

请建议一些方法…

导入系统,重新
import sys,re

if len(sys.argv)<3:
    print "Usage: %s filename functionname"%(sys.argv[0])
    exit(0)

f=open(sys.argv[1],"r")
func=sys.argv[2]
linec=0
braces=1
lines=f.readlines()

for i in range(len(lines)):
    if re.match(".{4}"+func,lines[i]):
        break

lines=[s.strip() for s in lines]
lines=[s for s in lines if len(s)!=0]

for k in lines[i+2:]:
    if k=="{":
        braces+=1
    if k=="}":
        braces-=1
    if braces<=0:
        break
    linec+=1

print linec
if len(系统argv) 建议做这件事的方法

非常粗略地说:

a) assume this is pedantic exercise for class, so ignore tricky bits like macros
b) open "filename"
c) read file into memory
d) strstr() for "function"
e) scan until you hit "{"
f) for(bracecount=1; bracecount > 0; )
g) ++ on {, -- }, skip char constants, skip comments, keep newline count
h) print newline count
  • 代码具有严格的格式,缩进源文件

    indent-kr-bap-nce-i8-ts8-sob-l80-ss-bs-npsl-bl-bli0 file.c

  • awk+substr($0,1,1)匹配“{”和“}”

    awk-F“,”{
    
    if(索引(v_func,$0)我曾经尝试过使用C语言,但它看起来效率不高。有没有其他方法?比C更有效?没有,除非你是编译器开发人员几十年来一直缺少的汇编专家,或者是一位才华横溢的硬件设计师,他可以加入一个定制ASIC,以比英特尔的芯片更快地完成这项工作,尽管有很多缺点。我的意思是说,还有其他脚本吗像perl这样的语言会有帮助??除非你的代码有严格的格式,否则如果没有某种类型的语法分析器,这将很难做到。如果你知道它总是被格式化的,那么当然,perl可能是一个不错的选择。你没有问过问题。你只是介绍了规范。你的问题是什么?你遇到了什么问题?你的问题仅仅是什么“这在Perl或其他语言中更容易吗?"好的,你可以用Perl或任何语言编写一个C解析器。我不认为用任何语言都很容易。你可能想从一个现有的解析器开始,所以从寻找其中一个开始,然后选择它的语言。这个python脚本应该至少打印给定示例的代码行数,只要正是这个例子,不是一个每行有多个大括号的例子,也不是一个包含大括号的字符串/字符常量,或者…等等。真的。删除引号,然后它才有意义。不,它没有意义。没有字符串可以传递给
    strstrstr
    来识别函数。当然,在使用pre-p的完整C解析器之前,可以创建任意复杂的示例处理器是必需的。这里的问题是:老师在寻找什么,而不是Sheldon会赞成什么。你发布的东西不是在限制范围内工作的东西。你发布的东西是永远不会工作的东西。
    indent
    tip=awesome。这看起来很有用;我想知道你是否可以调整它以显示完整的shell脚本(我猜,指定它作为count_lines_在_func.sh file.c[func_name]中调用),并使其在没有给定函数名的情况下打印每个函数以及其中的行数。
        awk -F"," '{
        if( index(v_func,$0)<10 )
        {
                findfunc=1;
        }
    
        if( findfunc == 1)
        {
           if( substr($0,1,1) == "{" )
           {
                   lineCnt=0;
           }
           else if(substr($0,1,1) == "}" )
           {
                   print lineCnt;
           }
           else
           {
                   lineCnt = lineCnt+1;
           }
        } }' v_func=$2 $1