【问题标题】:Counting operators in C++C++ 中的计数运算符
【发布时间】:2014-07-02 23:56:49
【问题描述】:

所以我需要统计C++源代码中条件语句的数量:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main ()
{
  char str[] = "String variable";
  cout << strstr (str,"variable") << endl;
  return 0;
}

我需要进行字符串搜索而不是语义搜索,因为这是一门课程作业,我认为他们不会期待令人印象深刻的东西。问题是,我如何告诉strstr() 函数查看整个源代码而不是作为第一个参数传递的单个变量?另外,这是解决作业的好方法吗?

【问题讨论】:

  • 由于您使用的是 C++,因此您应该避免使用 strstr。实际上,如果您可以使用 C++11 编译器,您应该考虑使用一些正则表达式功能,en.cppreference.com/w/cpp/regex
  • @Jack 因为我们有一个当前的标准,std::strstr 也很好定义。无论如何,这个问题很不清楚。
  • 好吧,我不知道如何更好地布置它。我只需要找到 if 和 if/else 语句的出现次数。
  • strstr 这样的简单字符串匹配函数根本无法完成这项工作。例如,它将查找名为 whatif 的变量作为 if 语句的实例。您的代码需要遵循 C++ 的解析规则。如果您有可用的正则表达式,那么它们就可以完成工作。否则,您可以查找标准并推出自己的标准。请注意,它并不像表面上看起来那么简单。
  • 我收回我的声明,即正则表达式可以完成这项工作。我无法想象任何可以处理 cmets 的正则表达式。

标签: c++


【解决方案1】:

所以我需要统计一个 C++ 程序中条件语句的数量。

问题是,我如何告诉 strstr() 函数查看整个源代码而不是作为第一个参数传递的单个变量?

您不能告诉 strstr(或任何其他 C/C++ 函数)搜索正在运行/编译的程序,因为此时源代码文本不再存在。

相反,您需要编写一个程序,该程序可以打开您的实际源文件(.cpp 文件、.h 文件等),将文本加载到内存中的字符串变量中,然后在这些变量中搜索您想要查找的任何内容。

【讨论】:

  • 我很确定 OP 打算阅读源代码,而不是编译结果。
  • 很难从这个问题中看出,但人们在运行时要求只能从源获得的东西并不少见,所以我想我会涵盖这方面。
【解决方案2】:

我在想您需要做的是创建一个文本解析器,它与您要检查的源是分开的。 为此,创建一个新的 C++ 项目,然后:

  1. Read in the file into memory
  2. 创建包含 C++ 中存在的条件语句的字符串或字符数组的查找表,例如:“if”、“else”、“goto”等。
  3. 遍历内存中的每个字符,并将找到的字符与查找表进行比较。如果找到匹配项,请增加一个计数器。

【讨论】:

  • 1) 使用这样的算法,您无需将文件读入内存。您可以一次执行一个简单的循环读取一个字符,并知道底层代码正在为您进行缓冲。 2) 好像你错过了第 4 步。这个解析器如何区分 ififfoo
  • 一次将文件全部读入内存或读取部分文件取决于操作员以及他希望如何增强解决方案。我的回答只是实现目标的指导方针,但他很可能会在此过程中遇到麻烦,这需要他/她自己进行调整以使解决方案更好。查找表可以在关键字字符串中包含空格。
  • 是的,我明白了,但是将整个文件读入内存对于学生来说只是不必要的复杂化。在关键字字符串中包含空格不会解决任何问题,因为if(foo) 不包含空格,但它是一个有效的条件表达式,而iffoo=1 是一个同样有效的赋值。
  • 您需要有一个状态机来处理 cmets。 “// if”不是条件语句,而是注释。更糟糕的是,您可以使用“/* if (help *) / 25 */”。换句话说,C-Style cmets 也需要被移除。解析 C 或 C++ 不仅仅是搜索单词。
  • @ThomasMatthews 没错。解析源代码远没有人们想象的那么简单。
猜你喜欢
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多