轨道
/
C++
C++
/
练习
/
日志级别
日志级别

日志级别

学习练习

简介

包含

一般来说,编程时不必重复造轮子。 许多标准算法,可能早就有人替你写好了。

include指令

要包含其他文件的内容,C++ 使用include指令。 这些包含语句应写在文件顶部。 编译时,带有该指令的那一行会被相应文件的内容替换。 包含之后,命名空间与原始文件中保持一致。

标准库

标准库提供了许多常用的函数、算法和数据结构。 标准库使用std命名空间。

C 数值库cmath就是一个例子。 它提供了许多常见的数学运算。

#include <cmath>

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

标准库用尖括号<>包含,而不是双引号"。 区别在于编译器搜索相应文件的位置。 使用尖括号时会跳过在当前项目中的搜索,直接从系统的包含目录开始。 如果要包含本地文件,则应使用双引号:#include "myfile"

字符串

在 C++ 中,string是一个可变对象,它把文本表示为字符序列(字母、数字、标点等)。 字符串通过调用它的方法来操作。

字符串库

在 C++ 中,字符串类型和相关函数在使用前必须先包含字符串库。 只需在文件顶部添加#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函数也非常有用。 它以字符串成员函数的形式调用,并接受一个字符串作为实参。 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)"
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
C++ Exercism

准备好开始 日志级别 了吗?

注册 Exercism,借助 19 个概念100 个练习 和真人导师指导,学习并掌握 C++,全部免费。