Печать пусто вводит в чистом C

Прямой подход

[abc]{3} будет соответствовать слишком многим результатам, поскольку он также будет соответствовать aab. Чтобы не выполнять двойное совпадение a, вам необходимо удалить a из следующей группы, оставив вас с a[bc]{2}.

a[bc]{2} будет соответствовать слишком много результатов, так как он также будет соответствовать 'abb'. Чтобы не выполнять двойное совпадение b, вам необходимо удалить a из следующей группы, оставив вас с ab[c]{1} или abc для краткости.

abc не будут соответствовать всем комбинациям, поэтому вам понадобится другая группа.

(abc)|([abc]{3}), что снова будет соответствовать слишком много комбинаций.

Этот путь ведет вас вниз по пути перечисления всех перестановок в явном виде в группах.

Можете ли вы создать комбинации, чтобы вам не нужно было записывать все комбинации?

(abc)|(acb) можно записать как a((bc)|(cb)).

(bc)|(cb) Я не могу сократить это дальше.

Совпадение слишком много и удаление ненужных

В зависимости от движка регулярных выражений вы можете выразить AND в качестве заглядывания вперед, чтобы вы могли удалять совпадения. ЭТО, а не ЭТО потребляет ЭТО.

(?=[abc]{3})(?=(?!a.a))[abc]{3} не будет соответствовать ака.

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

'(.) \ 1+' в этом выражении групповые ссылки используются для собственных совпадений с одним и тем же символом несколько раз, но требуется знание, сколько групп существует в выражении, и оно очень хрупкое. Добавление групп убивает выражение ((.)\1+), больше не совпадает , Относительные обратные ссылки существуют и требуют знания вашего конкретного движка регулярных выражений. \k<-1> может быть то, что вы могли искать. Я предполагаю, что .net, поскольку у меня есть тестер регулярных выражений, добавленный в закладки для этого.

Перестановки, которые я хочу исключить: nn. n.n .nn nnn

Итак, я создаю эти шаблоны: ((?<1>.)\k<1>.) ((?<2>.).\k<2>) (.(?<3>.)\k<3>) ((?<4>.)\k<4>\k<4>) [1142 ]

Собирая все это вместе, я получаю это выражение, обратите внимание, что я использовал относительные обратные ссылки в том виде, в каком они есть в .net - ваш пробег может отличаться.

(?=[abc]{3})(?=(?!((?<1>.)\k<1>.)))(?=(?!((?<2>.).\k<2>)))(?=(?!(.(?<3>.)\k<3>)))(?=(?!((?<4>.)\k<4>\k<4>)))[abc]{3}

Ответ "да" для конкретной длины.

Вот некоторые данные тестирования.

8
задан SMeyers 27 January 2009 в 09:22
поделиться

4 ответа

Q1: Таким образом, вопрос - это, можем мы создавать функцию в C, который распечатает элемент, который является, это - параметр

A: Не в пути Вы хотите. Необходимо будет передать информацию функции, говоря этому тип данных, Вы являетесь передающими.

Q2: и если да, как это возможно, потому что это полностью ускользает от меня в данный момент.

A: Это ускользает от Вас, потому что это не может быть сделано. Нет никаких метаданных, связанных с пустотой*, который компилятор или время выполнения могут использовать, чтобы выяснить, что они вводят, это указывает. Вы должны также

  1. передайте структуру, которая содержит a
    указатель и информация, о какой
    указатель указывает на (например, перечисление).
  2. передайте дополнительный параметр с информацией о том, на что указывает указатель

Поскольку код стоит единственная вещь, которую можно распечатать, вот адрес, на который я указываю.

Пустой указатель указывает на необработанные данные, printf предполагает, что Вы знаете, какой тип данных Вы печатаете, он не обладает никаким интеллектом и не может "понять это" для Вас.

Это - это простое.

То, что можно сделать, передать информацию о типе функции, но затем Вы заканчиваете с чем-то в точности как printf, который это сам, куда Вы передаете строку форматирования, содержащую информацию о типе о данных в следующем arguements.

Надеюсь, это поможет.

Также... "Нет никакой перегрузки в C как, я обычно использую в C++"

Даже в C++ перегрузка происходит во время компиляции, и здесь нет никакого пути к компилятору для знания, какие данные будут переданы той функции, поэтому даже при том, что Вы привыкли перегружаться, это никогда не работало бы как это (например, пробовало бы это то же самое с помощью printf, но компилировало бы его с компилятором C++, Вы получите точно те же результаты). На самом деле попробуйте

cout << i;

в функции выше, и это даст Вам адрес i точек к, не "значение" меня. Необходимо было бы бросить i и derference это, прежде чем Вы могли добраться, это - значение

cout << *(int*)i;

Так, для получения вышеупомянутой работы в C++, у Вас должно было бы быть много перегруженных функций (или шаблонная функция, которая является действительно тем же самым, кроме списков компилятора функции для Вас), например, перегруженные функции

printMe(int i){...}
printMe(double d){...}
printMe(char c){...}
printMe(char* string){...}

В c просто необходимо дать те собственные имена функций

printInt(int i){...}
printDouble(double d){...}
printChar(char c){...}
printString(char* string){...}
24
ответ дан 5 December 2019 в 05:19
поделиться

Для запуска Вы печатаете указатель, не, на что он указывает. Для печати фактического содержания необходимо передать *i кому: printf, нет i.

Если Вы действительно хотите сделать это, одно решение:

void printMe (void *p, int typ) {
    switch(typ) {
        case TYP_INT: printf("%d", *((int*)p)); break;
        case TYP_CHR: printf("%c", *((char*)p)); break;
        /* and so on ... */
    }
}
8
ответ дан 5 December 2019 в 05:19
поделиться

Таким образом, вопрос - это, можем мы создавать функцию в C, который распечатает элемент, который является, это - параметр

Да, мы можем. Такая функция уже является частью стандартной библиотеки - это называют printf ;)

Как нет никакой перегрузки функции времени компиляции в C, так или иначе необходимо предоставить тип аргументов во времени выполнения. printf строка формата может использоваться, чтобы сделать это, таким образом, нет действительно никакой причины создать Вашу собственную функцию обертки, когда уже существует рабочее решение.

0
ответ дан 5 December 2019 в 05:19
поделиться

При попытке распечатать значение указателя, корректное использование printf("%p", i);. 'd' спецификатор для целых чисел, и 'p' для указателей. Это - Ваша обязанность добраться, они исправляют, и плохие вещи могут произойти при спутывании их.

Я не знаю, почему это перестало бы работать для символа * и не интервал *, и возможно, что у Вас есть другие проблемы при порождении этого. Если это все еще перестало работать с %p, что-то еще было испорчено. Посмотрите, можно ли установить своего рода программное обеспечение монитора памяти, чтобы проверить на висячие указатели или удвоиться свободный () s, потому что в той точке умные деньги, что Вы повредили память где-нибудь.

0
ответ дан 5 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: