#c #string
#c #строка
Вопрос:
У меня есть функция, которая получает некоторые флаги и на основе этих флагов форматирует строку для печати в качестве выходных данных. Проблема в том, что эти флаги независимы друг от друга. Другими словами, выходные данные могут быть отформатированы таким количеством способов, сколько существует комбинаций этих флагов.
Есть 3 флага: bflag, nflag и sflag. Если bflag равно 1, nflag переопределяется. Но мы можем иметь b и s одновременно (или n и s), и оба по-своему манипулируют выходной строкой. Как я могу справиться с этим, не вкладывая все возможности в операторы if (единственный способ, который я могу придумать)?
Вот функция, которая получает неформатированную строку и флаги:
void outputLine(int *index, char buffer[], int bflag, int nflag){ //processes the options passed in the command line to create the output
if (nflag){
indexedLineout(index, buffer);
}
else if (bflag){
bprint(index, buffer);
}
else{//no options
printf("%s", buffer);
}
}
И вот indexedLineout():
void indexedLineout(int *index, char buffer[]){//adds an index to the beginning of the line
printf ("%*dt%s", 6, *index, buffer);
(*index) ;//increment the index
}
Я не думаю, что имеет значение показывать bprint(), поскольку он имеет очень похожее поведение на indexedLineOut() .
Если я хочу добавить флаг s, о котором я упоминал выше, который в основном ничего не печатает, если предыдущий вывод был пустой строкой, и убедитесь, что он также работает в сочетании с другими флагами, другими словами, убедитесь, что он может печатать пронумерованные строки, но не соседние пустые, как я могуя добиваюсь этого?
Комментарии:
1. Итак, вам нужны функции форматирования для каждого флага, возвращающие форматированную строку (не печатающую). Затем вы передаете эту строку следующей функции форматирования. После обработки каждого флага вы можете распечатать выходные данные.
2. Этот вопрос слишком расплывчатый для меня. Мне нужно было бы просмотреть несжатый код, чтобы понять, как его упростить.
3. Детали форматирования, которые должны выполняться под контролем различных параметров, действительно имеют значение в этом случае. В идеале вы могли бы применять их эффекты независимо друг от друга, так что вам нужна только одна функция для каждого параметра вместо отдельной для каждой комбинации параметров.
indexedLineout()
Поведение выглядит многообещающим в этом отношении, но неясно, будет ли другое форматирование хорошо сочетаться с этим и друг с другом.4. Просто для нашего понимания: что должно произойти, если вызывающий объект установит все три флага? Все ли флаги являются логическими, поэтому у нас всего восемь вариантов?
5. @user5329483 b нумерует все непустые строки, n нумерует все строки, а s удаляет все пустые соседние пустые строки. итак, если установлены все флаги, n переопределяется на b и создает вывод, в котором все непустые строки пронумерованы, и между каждой строкой может быть не более 1 пустой строки (эффект s)
Ответ №1:
Есть 3 флага: bflag, nflag и sflag. Если bflag равно 1, nflag переопределяется. Но мы можем иметь b и s одновременно (или n и s), и оба по-своему манипулируют выходной строкой. Как я могу справиться с этим, не вкладывая все возможности в операторы if (единственный способ, который я могу придумать)?
У вас есть две отдельные функции форматирования, управляемые тремя параметрами определенным образом, который должен быть относительно простым в обращении. Вы должны иметь возможность просто перебирать строки и для каждой из них:
- Сжимайте пустые строки, если это необходимо (флаги). Если строка пуста, предыдущая также была пустой, и
s
флаг действует, тогда пропустите эту строку. В противном случае, - При необходимости выведите номер строки (флаги n,b).
- если
n
флаг действует, аb
нет, тогда выведите номер строки, иначе - если
b
флаг действует, и строка не является пустой, тогда выведите номер строки.
- если
- Выведите саму строку.
Я не думаю, что я бы даже разделил это на отдельные функции, но если вы это сделаете, я бы рекомендовал выбирать функции, которые четко вписываются в эту схему.
Комментарии:
1. Я думаю, вам нужно переключить действия, связанные с
b
n
вашим алгоритмом и в нем.2. Нет, вы поменяли
b
местами иn
сами. Теперь вам также нужно изменить их порядок.