处理日志信息

概念学习C++17

简介

包含头文件

编程时通常不必重复造轮子。对于许多常见算法,其他开发者可能已经完成了你需要的实现。

包含指令

C++ 使用 include 指令引入其他文件的内容。通常应把这些指令放在文件顶部。在编译处理过程中,指令所在的行会被对应文件的内容替换。被包含文件中的命名空间保持原样。

标准库

标准库提供许多常用函数、算法和数据结构,其中的名称位于 std 命名空间。

例如,C 数值运算库对应的头文件 cmath 提供了许多常见的数学运算。

#include <cmath>

int cube_me(int a) {
    // raise `a` to the third power
    return std::pow(a, 3);
}

注意:头文件的搜索方式 标准库头文件使用尖括号 <>,而不是双引号 "。二者的区别在于编译器搜索文件的位置:尖括号形式通常直接从系统的包含目录开始查找,不先查找当前项目目录。包含本地文件时通常使用双引号,例如 #include "myfile"。实际搜索目录还取决于编译器及构建配置。

字符串

C++ 中的 string 是可修改的对象,用字符序列表示文本;字符可以是字母、数字或标点等。可以调用字符串的方法来处理字符串。

字符串库

使用字符串类型及其相关函数之前,需要先引入字符串库。在文件顶部添加 #include <string> 即可。相关名称位于 std 命名空间,因此字符串类型的完整名称是 std::string。字符串字面量使用双引号 "。

#include <string>
std::string w_berry_quote{"A well-made sentence, I think, is a thing of beauty."};

常见字符串操作

可以使用 + 运算符连接字符串:

std::string original_title{"The School of Rock"};
std::string sequel_indicator{"Electric Boogaloo"};
std::string next_movie_title = original_title + " 2: " + sequel_indicator;

使用字符串库时,需要了解一种调用方式:函数可以属于某个对象,这种函数称为成员函数。后续课程会进一步介绍成员函数及与之相关的类。

std::string qualification{"awesome"};
// 1st argument: from the index to the end of the string:
std::string who_is_awesome = qualification.substr(5);
// => "me"

// 2nd optional argument for the length:
std::string material{"haunted books"};
std::string ghost = material.substr(8, 3);
// => "boo"

find 也是非常实用的成员函数。对字符串调用它,并传入要查找的字符串,它会返回该内容第一次出现的位置;位置下标从 0 开始。

std::string new_release{"apple released a new app!"};
new_release.find("app");
// => 0
new_release.find("e");
// => 4

任务说明

本练习需要处理日志报告中的文本行。每条日志都是一个字符串,格式为 "[<LEVEL>]: <MESSAGE>"。

日志共有三种级别:

  • INFO
  • WARNING
  • ERROR

你需要完成三个任务。每个任务都会接收一条日志,并对它进行处理。

1. 提取日志消息

实现 log_line::message,返回日志中的消息正文:

log_line::message("[ERROR]: Invalid operation")
// => "Invalid operation"

2. 提取日志级别

实现 log_line::log_level,返回日志级别。返回的级别名称应保持大写:

log_line::log_level("[ERROR]: Invalid operation")
// => "ERROR"

3. 重新组织日志格式

实现 log_line::reformat,将消息正文放在前面,日志级别放在后面的圆括号内:

log_line::reformat("[INFO]: Operation completed")
// => "Operation completed (INFO)"
需要一点帮助?查看分步提示

提示

通用提示

1. 提取日志消息

2. 提取日志级别

连接字符串的方法有很多。最简单的是使用 + 运算符,也有更进阶的方法。