有没有办法定义" alternate"字符串终止符(除了null终止符,\ 0)

时间:2013-01-16 19:26:07

标签: c++ c string performance null-terminated

我不一定要这样做,但我很好奇。在C / C ++中有没有一种方法来定义字符串终结符其他而不是null终止符?例如,是否可以写这个,

char* str = "123456|ABCDEF";

char* foo = str;
char* bar = strstr(str, "|") + 1;

// do something here to define '|' as a terminator

std::cout << foo << std::endl;
std::cout << bar << std::endl;

// undo pipe-as-terminator definition

获取输出,

123456
ABCDEF

如果不可能,那么是否有任何方式来获取指向缓​​冲区部分的指针,没有分配/复制内存,而没有修改缓冲区,|覆盖到\0 s?

2 个答案:

答案 0 :(得分:6)

您可以编写一个字符串引用包装器,其中包含指向子字符串和大小的指针,然后使用write而不是operator<<

// Sketch
struct StringRef {
    const char* start;
    std::size_t length;
    // add code to initialize the object out of the substring
};
std::ostream& operator<<(std::ostream& o, const StringRef& s) {
   return o.write(s.start,s.length);
}

答案 1 :(得分:0)

我认为你不可能,因为这个规则在编译器中很难构建。事实是,编译器通过使用程序集“.asciz”指令在您声明的每个字符串常量的末尾包含null-trminator。所以除非你修改gcc的源代码,否则我认为你不能。我真的不知道其他编译器,如MSVC。对于Clang,我不知道是否有办法这样做,而且需要调查。作为替代方案,您可以通过艰难的方式进行操作并键入每个字符串     const char message [] = {'H','e','l','l','o','','!','|' };

但我想指出,如果编制者施加这种限制,那是有充分理由的。例如,假设您从用户处获取输入文本的程序。如果用户输入“|”怎么办在他的文字?选择空字符的原因是用户无法输入此字符(因为它不是可打印字符集的一部分,我不知道任何键盘包括'null'键无论如何至少,您应该将另一个字符作为空终止符,但不要使用可以轻松输入的字符。

否则,我对操作系统开发很感兴趣,人们喜欢重新发明轮子,我已经看到有人试图使用另一种技术:使用其长度修复每个字符串,允许在字符串中嵌入空字符,以及提供恒定时间的strlen()操作。此外,C#/。NET字符串是长度前缀和空终止,但我真的没有看到它的兴趣......

在我获得更高精度之前,我想知道你正在使用哪个编译器,以及编程中的“水平”(只是不告诉你你不会理解的东西)x)

干杯,摘要