Как использовать строки форматирования в пользовательских функциях?

Ответа на этот вопрос @ 42- отлично, но у меня был случай использования, когда я не хотел использовать zoo. Это легко реализовать с помощью dplyr с помощью lag и lead:

library(dplyr)
test = data_frame(x = sample(1:10, 20, replace = TRUE))
mutate(test, local.minima = if_else(lag(x) > x & lead(x) > x, TRUE, FALSE)

Как и решение rollapply, вы можете управлять размером окна и краем с помощью lag / lead n и default соответственно.

1
задан sixter 26 February 2019 в 05:16
поделиться

3 ответа

Поскольку наиболее часто используемым компилятором является gcc, я остановлюсь только на этом. Компилятор может проверить формат & amp; параметры такие же, как у printf

__attribute__ ((format (printf...

Из документации gcc формат

(архетип, индекс строки, первый для проверки) Формат Атрибут указывает, что функция принимает аргументы в стиле printf, scanf, strftime или strfmon, которые должны проверяться типом по строке формата. Например, объявление:

          extern int
          my_printf (void *my_object, const char *my_format, ...)
                __attribute__ ((format (printf, 2, 3)));


causes the compiler to check the arguments in calls to my_printf for consistency with the printf style format string argument

my_format.

The parameter archetype determines how the format string is interpreted, and should be printf, scanf, strftime or strfmon. (You

также может использовать printf , scanf , strftime или strfmon .) Параметр string-index указывает, какой аргумент является аргументом форматной строки (начиная с 1), в то время как first-to-check - это номер первого аргумента, который проверяется на соответствие форматной строке. Для функций, где аргументы недоступны для проверки (например, vprintf), укажите третий параметр как ноль. В этом случае компилятор проверяет только строку формата на согласованность. Для форматов strftime третий параметр должен быть нулевым.

In the example above, the format string (my_format) is the second argument of the function my_print, and the arguments to check start

с третьим аргументом, поэтому правильными параметрами для атрибута формата являются 2 и 3.

The format attribute allows you to identify your own functions which take format strings as arguments, so that GCC can check the

вызывает эти функции для ошибок. Компилятор всегда (если не используется -ffreestanding) проверяет форматы стандартных функций библиотеки printf, fprintf, sprintf, scanf, fscanf, sscanf, strftime, vprintf, vfprintf и vsprintf всякий раз, когда запрашиваются такие предупреждения (с использованием -Wformat), поэтому существует нет необходимости изменять заголовочный файл stdio.h. В режиме C99 также проверяются функции snprintf, vsnprintf, vscanf, vfscanf и vsscanf. За исключением строго соответствующих стандартных режимов C, также проверяется функция X / Open strfmon, как printf_unlocked и fprintf_unlocked. См. Опции Контроля C Диалект. format_arg (string-index) Атрибут format_arg указывает, что функция берет строку формата для функции стиля printf, scanf, strftime или strfmon и изменяет ее (например, чтобы перевести ее на другой язык), чтобы результат можно было передать функция стиля printf, scanf, strftime или strfmon (с остальными аргументами функции форматирования, такими же, как они были бы для неизмененной строки). Например, объявление:

          extern char *
          my_dgettext (char *my_domain, const char *my_format)
                __attribute__ ((format_arg (2)));


causes the compiler to check the arguments in calls to a printf, scanf, strftime or strfmon type function, whose format string argument

является вызовом функции my_dgettext для согласования с аргументом строки формата my_format. Если атрибут format_arg не был указан, то при таких вызовах функций форматирования компилятор мог бы сказать, что аргумент строки формата не является постоянным; это вызовет предупреждение при использовании -Wformat-nonliteral, но вызовы не могут быть проверены без атрибута.

0
ответ дан P__J__ 26 February 2019 в 05:16
поделиться

Вы можете использовать функцию sprintf для форматирования строк и печати на ЖК-дисплее.

 char buffer[50]; 
 int a = 10, b = 20, c; 
 c = a + b; 
 sprintf(buffer, "Sum of %d and %d is %d", a, b, c); 

Теперь buffer будет иметь отформатированные строки

0
ответ дан Harikrishnan 26 February 2019 в 05:16
поделиться

Вы можете написать переменную функцию и передать параметры в vsnprintf():

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

void display(int foo, int bar, char const *format, ...)
{
    va_list arglist;
    va_start(arglist, format);

    int length = vsnprintf(NULL, 0, format, arglist);
    char *buffer = malloc(length * sizeof *buffer); 
    vsnprintf(buffer, length, format, arglist);
    va_end(arglist);

    puts(buffer);
    free(buffer);
}

int main(void)
{
    display(42, 13, "%s %d %f", "Hello", 99, 100.13);
}
0
ответ дан Swordfish 26 February 2019 в 05:16
поделиться
Другие вопросы по тегам:

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