Есть ли способ определить «альтернативный» терминаторы строки (в дополнение к нулевому терминатору, \ 0)

Я не обязательно хочу это делать, но мне любопытно. В C / C ++ есть способ определить терминаторы строки Другой чем нулевой терминатор? Например, можно ли написать это,

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

?

Если не возможно, то есть любой способ получить указатели на части буфера, без выделение / копирование памяти и без изменение буфера, то есть перезаписывая |с \0s?

1

Решение

Вы можете написать оболочку ссылки на строку, содержащую указатель на подстроку и размер, а затем использовать 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);
}
6

Другие решения

Я не думаю, что вы могли бы, так как это правило сложно встроено в компилятор. Дело в том, что компилятор включает null-trminator в конце каждой строковой константы, которую вы объявляете, используя директиву ассемблера .asciz. Поэтому, если вы не измените исходный код gcc, я не думаю, что вы можете. Я действительно не знаю, для других компиляторов, таких как MSVC. Для Clang, я не знаю, есть ли способ сделать это или нет, и это потребует расследования. В качестве альтернативы, вы можете просто сделать это сложным способом и набрать каждый из ваших строк как
const char message [] = {‘H’, ‘e’, ​​’l’, ‘l’, ‘o’, », ‘!’, ‘|’ };

Но я хотел бы отметить, что если компиляторы налагают такого рода ограничения, то на то есть веская причина. Например, представьте программу, в которой вы берете вводимый текст у пользователя. Что делать, если пользователь вводит ‘|’ в его тексте? Причина, по которой был выбран нулевой символ, заключается в том, что пользователи не могут ввести этот символ (поскольку он не является частью набора печатаемых символов, и я в любом случае не знаю ни о какой клавиатуре, в том числе клавише ‘null’). По крайней мере, вы должны взять другой символ в качестве нулевого терминатора, но не берите символ, который можно легко ввести.

В остальном меня интересует разработка операционной системы, где людям нравится изобретать велосипед, и я уже видел людей, которые пытались использовать другую технику: фиксировать каждую строку по ее длине, позволяя вставлять нулевые символы в строку, а также обеспечение strlen () операций с постоянным временем. Кроме того, строки C # / .NET имеют префикс длины и заканчиваются нулем, хотя на самом деле я не вижу в этом интереса …

Прежде чем я стану более точным, я хотел бы знать, какой компилятор вы используете, и ваш «уровень» в программировании (только чтобы не рассказывать вам о вещах, которые вы не поймете) x)

Ура, аннотация

0

По вопросам рекламы [email protected]