sprintf
объявлен как int sprintf (char * str, const char формат, ...); char* str
- это буфер, на который будет записываться вывод, однако злоумышленники могут помещать больше в этот буфер, чем размер этого буфера, поэтому можно также использовать snprintf
, который включает в себя параметр, который содержит размер выходного буфера, поэтому потоки bufferoverflow не будут выполняться. То, что вы должны отметить, возвращает количество записанных байтов, поэтому вы не можете назначить его char или char [].
const char* foo = "foo";
static char end[BUFSIZE];
snprintf(end, BUFSIZE, ""%s_bar", foo);
Я предпочитаю использовать snprintf
для него не так легко привести к переполнению буфера, который является ошибка безопасности. Теперь он может исправить BUFSIZ
символов до end
, вы можете посмотреть, удалось ли выполнить конкатенацию, если snprintf возвращает strlen («s_bar») + strlen («foo»);
Что вы можете сделать, это:
char end[BUFSIZE] = "foo_";
strncat(end, "_bar", BUFSIZ);
, который, возможно, больше, чем вам нравится.
Вы можете использовать оператор '##' в макросе –
@alk - а как насчет когда есть переменная? Итак, «_bar» - это действительно переменная строка ... – user983223
Обратите внимание, что на 64-битной машине вы выделили 12 байтов для поддержки 'foo': 8 байт для указателя и 4 байта для строки. Если вы получаете что-то для работы, у вас есть 16 байт, выделенных для 'end': 8 байтов для указателя и 8 байтов для строки. Вы должны указать 8 байтов для строки как-то. Обратите внимание, что использование 'const char foo [] =" foo ";' выделяет только 4 байта для строки, а 'const char end [] =" foo_bar ";' только выделяет 8 байтов для строки. –