snprintf используя спецификатор формата в строке, которая копируется - PullRequest
2 голосов
/ 27 марта 2020

Я создал следующую программу:

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

#define TESTER "name=%s "

int main(){
    char *x;
    x = malloc(100);
    snprintf(x, 100, "Heyaa tester %s", TESTER, "hello");
    printf("%s", x);
    free(x)
    return 0;
}

Я в основном пытаюсь получить вывод что-то вроде - "Hey tester name = hello", однако, похоже, что как показано ниже:

Heyaa tester name=%s

Нужно ли сначала добавить hello к макросу, а затем сделать snprintf к переменной mallo c 'd.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 27 марта 2020

Необходимо включить макрос как часть спецификатора формата snprintf(), где он расширяется до "name=%s " во время самого препроцессора и создается объединенная строка "Heyaa tester name=%s". То, что у вас есть в OP, превращает name=%s в буквальную строку, которая будет обрабатываться при go %s с помощью snprintf()

snprintf(x, 100, "Heyaa tester " TESTER, "hello");

Ваша первоначальная попытка должна была быть признана подозрительной, если Вы включили дополнительный флаг предупреждений в вашем компиляторе, так как printf() вывел бы предупреждение слишком много аргументов, но не нашло бы достаточное количество спецификаторов ([-Wformat-extra-args] с g cc).

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

2 голосов
/ 27 марта 2020

Как указывал @Eraklon, хотя макрос и расширен в препроцессоре, он присоединяется к спецификатору формата во время компиляции.

Вы можете изменить эту строку, как показано ниже, и это будет работать.

snprintf(x, 100, "Heyaa tester " TESTER, "hello");

Здесь макрос разворачивается в препроцессоре, затем мы выполняем конкатенацию строк, и после этого спецификатор формата при компиляции получит "hello".

Just FYI: Macro и строка, строка и строка, макрос и макрос могут быть объединены, просто используя пробел между ними. Компилятор обрабатывает смежные строки как одну строку. Но будьте осторожны, он не будет работать со строковой переменной.

Для дальнейшего чтения: C / C ++ конкатенация макросов

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