“ ^ A”的字符串到底是什么?

时间:2018-11-17 08:38:42

标签: c++ character ascii

我根据在线判断运行代码。我记录了字符串,密钥。下面是我的代码:

fprintf(stderr, "key=%s, and key.size()=%d\n", key.c_str(), key.size());

但是结果是这样的:

key=^A, and key.size()=8

我想^A用ascii表示什么。 ^A的大小是2而不是8,但是它表明它是8。我通过vim查看结果,并且log_file由UTF-8编码。为什么?

2 个答案:

答案 0 :(得分:2)

您的查看器选择向您显示使用其选择的字符编码解释的字节,并选择显示caret notation中的结果字符。

其他观众可能会在这两个方面做出不同的选择,或者让您指出自己想要的内容。例如,用control picture characters(␁)代替插入符号。

对于std:stringc_str()由实际值后面的附加\x00字节终止。您经常将c_str()与期望字符串\x00终止的函数一起使用。这适用于fprintf。在这种情况下,读取的内容会在看到第一个\x00之前结束。

您的字符串中有几个\x00字节,它们当然有助于size(),但是fprintf会在第一个字节处停止(不计入)。

答案 1 :(得分:0)

我自己解决了。如果将std :: string“ \ x01 \ x00 \ x00 \ x00 \ x00 \ x00end”写入文件并在以后用vim打开它,则会得到'^ A'。

这是我的测试代码:

string sss("\x01\x00\x00\x00\x00end");
ofstream of("of.txt");
for (int i=0; i<sss.size(); i++) {
    of.put(sss[i]);
}

of.close();

打开文件“ of.txt”后,看到“ ^ A”;