Не идеальный, но если у Вас есть действительно странная установка сервера приложений, Вы могли бы всегда использовать antrun набор задачи для выполнения, когда упаковка выполняется
<build>
....
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<configuration>
<tasks>
<!-- Ant copy tasks go here -->
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Из документации glibc sprintf () :
Поведение этой функции следующее undefined, если происходит копирование между перекрывающимися объектами - для Например, если s также задано как аргумент для печати под контролем преобразования "% s".
Это может быть безопасно в конкретной реализации; но вы не могли рассчитывать на его переносимость.
Я также не уверен, что ваше предложение будет безопасным во всех случаях. У вас все еще могут быть перекрывающиеся буферы. Уже поздно, и моя жена меня обманывает, но я думаю, что у вас все еще может быть случай, когда вы хотите снова использовать исходную строку в объединенной строке и перезаписывать нулевой символ, и поэтому реализация sprintf может не знать, где повторно используется строка заканчивается.
Возможно, вам просто захочется прикрепить snprint () к временному буферу, а затем strncat () к исходному буферу.
В данном конкретном случае это будет работать, потому что строка в буфере
будет первой, что будет введено в буфер
( опять же, бесполезно), поэтому вы должны использовать strcat ()
вместо этого, чтобы получить [почти] тот же эффект.
Но если вы пытаетесь объединить strcat ()
с возможности форматирования sprintf ()
, вы можете попробовать следующее:
sprintf(&buffer[strlen(buffer)], " <input type='file' name='%s' />\r\n", id);
Если вы хотите объединить форматированный текст в конец буфера с помощью printf (), я бы рекомендовал вам использовать целое число для отслеживания конечной позиции.
int i = strlen(buffer);
i += sprintf(&buffer[i], " <input type='file' name='%s' />\r\n", id);
i += sprintf(&buffer[i], "</td>");
или:
int i = strlen(buffer);
i += sprintf(&buffer[i], " <input type='file' name='%s' />\r\n", id);
strcat(&buffer[i], "</td>");
И прежде чем люди сойдут с ума, проголосовав против этого («Это небезопасно! Вы можете переполнить буфер!»), Я просто обращаюсь к разумному способу создания форматированной строки на C / C ++.