美文网首页
[27无验证]程序注释统计-字节跳动2018秋

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

作者: jdzhangxin | 来源:发表于2018-10-28 11:29 被阅读29次

    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 <bits/stdc++.h>
    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<s.size();++i){
            if(s[i] == '"'){// 字符串开始与结束
                if(inString == false){ // 如果前面没有在字符串中
                    inString = true;// 标记开始字符串
                }else{
                    inString = false;// 标记在字符串中
                }
                // inString = !inString;
            }
            if(!inString){
                if(s[i] == '/'){
                    if(s[i+1] == '/'){ // 单行注释开始
                        if(!multiComment){// 确定//不是多行注释中
                            sinlgeComment = true;
                        }
                    }else if(s[i+1] == '*'){ // 多行注释开始
                        if(!sinlgeComment){// 确定/*不是单行注释中
                            multiComment = true;
                        }
                    }
                }
                if(s[i] == '\n'){// 单行注释结束
                    if(sinlgeComment){
                        ++count;
                        sinlgeComment = false;
                    }
                }
                if(s[i] == '*' && s[i+1] == '/'){// 多行注释结束
                    if(multiComment){
                        ++count;
                        multiComment = false;
                    }
                }
            }
        }
        printf("%d\n",count);    
    }
    
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <string>
    #include <vector>
    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秋

          本文链接:https://www.haomeiwen.com/subject/fnrloftx.html