Как проглотить параметр в printf в C - PullRequest
4 голосов
/ 17 июня 2019

Скажем, у меня есть printf со многими параметрами:

printf("%d %d %d %d", A, B, C, D);

По какой-то причине я хотел бы, чтобы один параметр больше не печатался, но все же был бы включен в список параметров (например, по визуальной причине или, возможно, это вызов функции с необходимым побочным эффектом и т. Д.).

Могу ли я заменить% d буквой преобразования без вывода? Я не помню такого конверсионного письма. Или, может быть, игра с флагами ...?

[Edit] Я только что заметил, что у scanf есть нечто подобное (но обратное): флаг подавления присваивания '*'. например sscanf("123 345 678", "%i %*i %i", &a, &b) приведет к = 123 b = 678

Ответы [ 4 ]

12 голосов
/ 17 июня 2019

Если вы по какой-то причине должны изменить их на лету, то будьте проще:

printf("%d ", A);
printf("%d ", B);
if(c) 
  printf("%d ", C);
printf("%d ", D);
2 голосов
/ 17 июня 2019

Вы можете подавить аргументы Strings (char*), указав нулевую ширину.

Однако я не знаю способа подавления числовых (int и float) значений.

int main(void) {
    int a=1;
    char*  b="hello";  // Gets Suppressed
    int c=3;

    printf("%d %.0s %d\n", a, b, c); // .0 means "zero-width"
    return 0;
}
1 голос
/ 17 июня 2019

Прежде всего, я согласен с комментарием Радлава Цибульского: полагаться на побочные эффекты опасно. Поэтому, пожалуйста, не делайте этого.

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

Единственное (не очень элегантное) решение, которое я мог бы придумать, которое делает что-то похожее на то, чего вы хотели бы достичь, это создать такой макрос:

#define SUPPRESS_PRINT(x) "\0"/*x*/

Это заменит параметр нулевым символом-терминатором.

Тогда вы можете использовать его в своем выражении printf следующим образом:

printf("%d %d %s %d", A, B, SUPPRESS_PRINT(C), D);

Обратите внимание, что заполнитель для C (то есть подавленный параметр) должен был быть изменен на% s, который является строкой с нулевым символом в конце, чтобы этот "трюк" дал желаемый результат.

0 голосов
/ 17 июня 2019

Я не уверен, что именно вы подразумеваете под подавлением, но один (сложный) способ сделать выходные изменения таким образом, что вы можете (или не хотите) это иметь строковую переменную, представляющую строку формата в printf например,

char format[20];
int A, B, C, D;

strcpy(format, "%d %d %d %d");

if (C==0) strcpy(format, "%d %d [%d] %d");

printf(format, A,B,C,D);

Недостатком этого метода является то, что вы все равно должны печатать A, B, C и D и в таком порядке, но вы, безусловно, можете 'пометить' что-то другое с текстом вокруг одного или несколькихчем одно из чисел ....

если int A=2, B=3, C=0, D=0;, то печатается 2 3 [0] 0, но если int A=2, B=3, C=1, D=0;, то печатается 2 3 1 0.

Если это последнее числовы хотите подавить, тогда вы можете использовать ....

char format[20];
int A, B, C, D;

strcpy(format, "%d %d %d %d");

if (D==0) strcpy(format, "%d %d %d");

printf(format, A,B,C,D);

но я не думаю, что это хорошая практика обязательно.Это будет зависеть от того, как printf отреагирует на получение дополнительного параметра ....

Теперь вывод будет 2 3 0 1, если int A=2, B=3, C=0, D=1;, но 2 3 0, если int A=2, B=3, C=0, D=0;

Наконец, вы можете подавить, используя приведенный ниже код

char format[20];
int A=2, B=3, C=0, D=1;

strcpy(format, "%d %d %d %d");

if (C==0) strcpy(format, "%d %d %d\b\b %d");

printf(format, A,B,C,D);

, потому что '\ b' выполняет возврат, поэтому при условии, что ваш терминал хорошо работает с \b, вы должны иметь возможность подавить aчисло в середине - обратите внимание, что это не будет работать с числом в конце, потому что \b перемещает курсор, но не стирает, поэтому вам нужно будет напечатать некоторое пространство после

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...