题
我有以下字符串:
index 0 1 2 3 4 5 6 7
std::string myString with the content of "\xff\xff\xff\x00\xff\x0d\x0a\xf5"
当我指的myString的[3],我得到预期 '\ X00' 值。
但是,当我指的myString [5],我得到两个值 “\ X0D \ X0A”,而不只是 '\ X0D'。
更有趣的是所述的myString [6]的值,这是 '\ XF5'。这一次,它就像\ X0D并不存在,正确的位置被引用。
我的问题是:什么特别之处在性病的\ X0D字符:字符串对象?怎么就被索引时跳过?这就像这样计算:
index 0 1 2 3 4 5 5 6
std::string myString = "\xff\xff\xff\x00\xff\x0d\x0a\xf5"
作为注释中,“\ X0D”字符是第13 ASCII字符“回车”和“\ X0A”是换行字符。
更新:它可以是的std :: string认为“\ X0D \ X0A”为单个字符,从而占据所述串中只有一个位置?这是 '\ X0D' 一个 “神秘” 人物方面的std :: string?
解决方案
您确信这是与std::string
发生了什么? std::string::operator[]
返回const char &
,所以它可以如何返回2个字符('\x0d'
和 '\x0a'
)?
这是说,"\x0d\x0a"
通常用于Windows下的行尾,而只有'\x0a'
在Linux下使用,所以前者向后者的转换Windows下是比较常见的 - 例如,我想的行为当fopen
称为"wt"
。我猜想类似的事情是发生在你身上。
修改的:通过对原来的问题你的意见,我想我能猜到是怎么回事
。我相信你的串并没有真正包含你认为它包含的内容。因为你使用的机制,以输出字符串到文件(可能ofstream
?)正在执行结束行翻译你被误导。这意味着,一个'\n'
(Unix的结束行代码)被翻译成'\r\n'
(Windows的结束行的代码)。结束线平移的目的是使代码的操作系统之间的可移植性。可以通过打开在文件抑制它的二进制模式;对于ofstream
,这是通过指定ios_base::binary
标志,当你打开该文件完成,但该标志不会被默认设置。
(见本维基百科文章的详细信息,在不同的结束标记线操作系统。)
这是什么,我相信是怎么回事。您的字符串实际上包含
index 0 1 2 3 4 5 6
myString contents "\xff\xff\xff\x00\xff\x0a\xf5"
您正在输出它是这样的:
ofstream file("myfile.txt");
for(size_t i=0; i<myString.size(); i++)
ofstream << myString[i];
由于结束的行翻译以上expalined,在'\x0a'
的myString[5]
正在作为'\x0d\x0a'
输出,而这正是是混淆你。
其他提示
这是怎么回事错在这里有一件事是以下行不会做你所期望的:
std::string myString = "\xff\xff\xff\x00\xff\x0d\x0a\xf5";
此调用std::string(const char *)
构造函数,它被设计为一个C语言风格的空终止字符串转换成C ++ std::string
。此构造方法读取字节在给定的指针,并将它们复制到新std::string
开始,直到它到达一个空字节(\ X00)。这与C函数如strlen()
的行为一致。
所以,当您myString
构造,它由长度为3的串的,与字节\ XFF,\ XFF,\ XFF。访问索引大于2正在访问的字节关闭阵列(其将在最好产生一个运行时间错误,或未定义的行为在最坏的情况)的端部。
请注意,一个std::string
可以容纳中间空字节,但不能使用上面的构造,因为空字节被解释为终止传递到构造C风格串来初始化这样的字符串。
这将是值得更改为其他的\ x00的字节再次尝试你的代码,只是为了看看它是如何不同于你已经说明:
std::string myString = "\xff\xff\xff\x01\xff\x0d\x0a\xf5"
此外,检查myString.length()
上述构造后,看看你会得到什么。
您创建的字符串与下面的构造函数:string(char const *)
它接收NUL终止的C字符串。因此,它根据第一个0字符找到它的长度。
通过调用string(char const *,size_t n)
:您应该使用其他的构造,它指定大小
std::string myString("\xff\xff\xff\x00\xff\x0d\x0a\xf5",8);
请参阅 http://www.cplusplus.com/reference/string/string进一步阅读/串/
您可能滥用[]操作。
[]操作返回一个const char。然而,你可能正在使用这个作为一个指针,从而获得两个人物 - 我们需要看到实际的代码,以确认该
0x00为空终止的C-字符串,所以这可能是为什么你得到的只有一个(正确)的字符。
会发生什么事,当你得到[4]?
在视觉工作室2008年,\ X00被认为是字符串的末尾。所以myString.lenght当您尝试访问的myString [5]你得到一个错误返回3。