[27无验证]程序注释统计-字节跳动2018秋

1.题目描述

C 语言有两种注释,单行注释 // 和多行注释 /* */。请编写程序,统计注释数量。注意引号中的不要统计,以及引号中可能出现的转义字符影响。

  • 输入描述:
    C语言源程序
  • 输出描述:
    两种注释加起来的总数量
  • 备注:
    数据范围:
    对于 50%的数据,0 < 输入行数 < 20
    对于 100%的数据,0 < 输入行数 < 1000
  • 输入示例:
    // line comment
    // line comment2
    int main() {
      return 0;
    }
    
  • 输出示例:
    2
    
  • 说明:
    输入有两个单行注释
  • 输入示例 2:
    // line comment // 
    /* block comment */ /* block comment 2 */ 
    int main() {
      char[] s = "/* string */";
      return 0;
    }
    
  • 输出示例 2:
    3
    
  • 说明:
    输入有一个单行注释和两个多行注释,共 3 条注释;注意引号中的不是注释

2.题目解析

需要熟悉C++语法

3.参考答案

#include 
using namespace std;

int main(){
    // 单行注释//开始,回车换行结束
    // 多行注释/*开始,*/结束
    // 字符串"开始,"结束
    
    string s = 
    "// line comment\n"
    "// line comment2\n"
    "/* block comment */ /* block comment 2 */\n"
    "// /* block comment */ /* block comment 2 */\n"
    "/* // block comment */ /* // block comment 2 */\n"
    "int main(){\n"
    "char[] s = \"/* string */\";"
    "return 0;\n"
    "}\n";
    int count = 0;// 统计注释个数
    bool inString = false; // 表示字符串中
    bool sinlgeComment = false; // 表示在单行注释中
    bool multiComment = false; // 表示在多行注释中
    for(int i=0;i
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int main() {
  string code;// 代码
  // 获取输入,直至Ctrl+Z
  char c = getchar(); // 获取输入字符
  while (c != EOF){
    code += c;
    c = getchar();
  }
  
  // 解析代码
  int res = 0;// 注释统计个数
  bool c1 = false;// 第一种注释方式(单行注释)
  bool c2 = false; // 第二种注释方式(多行注释)
  bool qs = false;// 双引号处理

  // 遍历代码中的每一字符
  for (int i = 0; i < code.size(); i++) {
    if (code[i] == '\n') { // 遇到换行
      c1 = false;// 单行注释结束
    } else if (c1) {
    } else if (c2) {
      // 统计
      if (i + 1 < code.size() 
          && code[i] == '*'
          && code[i + 1] == '/') { // 多行注释结尾判断
        c2 = false;
        i++;
      }
    } else if (qs) {
      if (code[i] == '"'){ // 双引号结束判断
        int t = false;
        for (int j = i - 1; j >= 0; j--)
          if (code[j] == '\\') {
            t++;
          } else {
            break;
          }
          if (t % 2 == 0) qs = 0;
        }
    } else if (code[i] == '"') { // 双引号开始
      qs = true;
    } else if (i + 1 < code.size() && code[i] == '/' && code[i + 1] == '/') { // 单行注释开始
      c1 = true;
      res++;
      i++;
    } else if (i + 1 < code.size() && code[i] == '/' && code[i + 1] == '*') { // 多行注释开始
      c2 = true;
      res++;
      i++;
    } else if (code[i] == '\'') {// 转义字符
      if (code[i + 1] == '\\')
        i += 3;
      else
        i += 2;
    }
  }
  printf("%d",res);
  return 0;
}

你可能感兴趣的:([27无验证]程序注释统计-字节跳动2018秋)