Везде ли строки содержат пустые подстроки?

этот вопрос возникает из дискуссии, происходящей на ответ.

в двух словах: автор ответа (0x499602D2) утверждал (правильно, как я теперь знаю), что когда не пропускает пробелы, но следующий символ является пробелом, все экстракты, за исключением символов, потерпят неудачу.

я поставил под сомнение это на том основании, что я думал, что извлечение string не должно завершиться ошибкой, так как поток содержит пустую строку разделенных пробелом в начале.

это переросло в общую дискуссию о том, есть ли пустая строка в любой позиции в строке, например, между a и b строки "ab" (Я говорю Да, 0x499602D2 говорит нет). 0x499602D2 предложил мне поставить этот вопрос, так вот я делаю.

я копирую свои основные аргументы для своей позиции из этого потока (включая часть чата):

давайте сначала посмотрите на константу для пустой строки. В C и c++ содержимое разделяется кавычками в начале и конце. Так как же выглядит пустая строка? Ты знаешь это:"". Видите ли, после начальной кавычки (разделителя) непосредственно следует окончательная кавычка (разделитель). Пустая строка находится между двумя кавычками, которые следуют непосредственно друг за другом, потому что пустая строка не имеет символов. Также посмотреть на представление с. Это последовательность символов, за которой следует разделитель ''. Итак, каково представление пустой строки? Ну, символы пустой строки, за которой следует разделитель. Это означает, что первый символ является разделителем (то есть точно так же, как в случае потока). Теперь рассмотрим конкатенацию строк, где, например, первая строка "a", вторая строка пуста, а третья строка -"b". Так что же такое конкатенация? Ну,"ab". Так что ясно, что между a и b in "ab" (мы явно поставили его там!). И конечно, это верно и до a и после b. То есть между любыми двумя символами строки есть пустая строка (или две, или миллион).

пустая строка не имеет символов, а между последовательными символами нет символов. Поэтому между двумя символами есть пустая строка. Также смотрите другие аргументы, что я дал раньше. Кроме того, рассмотрим регулярные выражения, которые соответствуют пустую строку: они везде. Например, /ab*c/ игр "ac", потому что b* соответствует пустой строке между a и c

есть пустая строка (i.e, без символов) перед разделителем (пробелом), как и в представлении c пустой строки, перед разделитель. Также обратите внимание, что readline также работает то же самое с n разделитель: если n следует немедленно, он не терпит неудачу, но дает пустую строку.

я не могу определить основные аргументы 0x499602D2 в обсуждении, поэтому я не пытаюсь избежать непреднамеренно несправедливого выбора. Вы должны иметь возможность видеть их в комментариях (и, возможно, в чате - я понятия не имею, доступно ли это всем). @0x499602D2: если вы хотите, вы также можете сами добавить свои основные аргументы после этого абзаца.

практический вопрос, связанный с этим: Если хорошо продуманная функция извлечения строки завершается ошибкой, если перед разделителем нет символов (как operator>> для строк), или преуспеть и вернуть пустую строку (как readline делает)?

1 ответов


Теорема

там пустая строка ε в любой позиции в строке s.

доказательство

1. If/s| = 0 (s имеет длину ноль), то s = ε, и претензии имеет.

2. If/s| > 0, тогда s имеет две крайние позиции: перед первым символом и другой после последнего. С ε является элементом идентификации операции конкатенации, то есть es = se = s, утверждение выполняется как для начальной, так и для конечной позиций.

3. If/s| > 1, то s можно записать как конкатенацию двух непустых строк:s = pq, где |p | > 0 и| q / > 0. Использование свойства элемента identity ε, pεq = (pε) q = pq = s, что означает, что требование выполняется для позиции в s, который делит его на части p и q. Позиция этого подразделения может быть любой внутренней позицией s, таким образом, требование выполняется для каждой внутренней позиции.

следствие

элемент идентичности свойство подразумевает, что ε = εε = εεε = etc. Повторение приведенного выше доказательства после замены ε С ε^n, где n является положительным целым числом, мы находим, что существует бесконечное количество пустых строк в любой позиции в любой строке.

Примечания

здесь слово " позиция "означает" позиция каретки" ( курсор вставки текста положения). Каретку можно поместить перед первым символом (index: 0), между последовательными символами и после последнего символа (index: |s|). Количество позиций каретки равно |s| + 1.

приведенное выше доказательство показывает, что эти" зазоры нулевой ширины " между символами можно представить как заполненные произвольным числом пустой строки. (Это так же странно, как то, что пустой набор является подмножеством каждого набора, включая себя.)