我根据在线判断运行代码。我记录了字符串,密钥。下面是我的代码:
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编码。为什么?
答案 0 :(得分:2)
您的查看器选择向您显示使用其选择的字符编码解释的字节,并选择显示caret notation中的结果字符。
其他观众可能会在这两个方面做出不同的选择,或者让您指出自己想要的内容。例如,用control picture characters(␁)代替插入符号。
对于std:string
,c_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”;