我不一定要这样做,但我很好奇。在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?
答案 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)
干杯,摘要