为什么在查询分配给包含控制字符的 char 数组的字符串时,gdb 会转义八进制字符?

问题描述 投票:0回答:1

我注意到,当将 std::string_view (或 std::string)分配给包含控制字符(例如 ' ' [标题开始])的字符数组时,gdb 将用八进制转义表示该 string_view已存在的控制字符和另一个特定字符之间的字符(在我的例子中为“=”)。

示例:

#include <array>
#include <iostream>
#include <string>
#include <string_view>

int main(int argc, char *argv[]) 
{
    const std::array<char, 32> myArr = 
    { '8', '=', 'F', 'I', 'X', 'T', '.', '1', '.', '1', 
    '\001', '9', '=', '9', '0', '\001', '3', '5', '=', 'A' };


    const std::string_view view(myArr.begin(), myArr.size());
    const std::string      str (myArr.begin(), myArr.size());

    std::cout << "VIEW:   " << view << std::endl;
    std::cout << "STRING: " << str  << std::endl;

    return 0;

}

使用 g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 编译,输出:

VIEW:   8=FIXT.1.19=9035=A
STRING: 8=FIXT.1.19=9035=A

查看 gdb 调试器中的

view
str
,我们看到:

"8=FIXT.1.1\001\071=90\001\063\065=A", '\000' <repeats 11 times>

我们可以看到,在第一次出现

'\001' 
后,所有“键”值都是八进制转义的。

为什么会这样?

从数组中删除控制字符时,“转义转换”并未完成。但是,在实际示例中,数组必须包含控制字符。

我确实想指出,这不是问题,因为子字符串查找仍然工作得很好。

我只是想知道为什么 gdb 给我们这个表示。

c++ string g++ escaping string-view
1个回答
0
投票

想一想,如果 GDB 打印控制字符后面的数字时没有对其进行转义,会发生什么情况。它看起来像这样:

"8=FIXT.1.1\0019=90\00135=A", '\000' <repeats 11 times>

实际八进制转义序列的结尾将无法识别。因此,GDB 正在为您提供一项服务,它通过转义来告诉下一个字符从哪里开始。

如果在控制字符后面放置非数字,GDB 不需要转义它们,因为它们不会与转义序列混淆。

© www.soinside.com 2019 - 2024. All rights reserved.