我有以下字符串:

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?

附加信息: http://en.wikipedia.org/wiki/Newline

有帮助吗?

解决方案

您确信这是与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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top