Во-первых, чтобы вставить однозначный префикс в строку «Hello World», вам необходим буфер из 13 символов - один для префикса, одиннадцать для символов в «Hello World» и один для завершающего нулевого символа. .
Во-вторых, вы не должны передавать буфер в snprintf
в качестве как выходного буфера, так и входной строки. Его поведение не определяется стандартом C, когда переданные ему объекты перекрываются.
Ниже приведена программа, которая показывает, как вставить префикс, перемещая строку с помощью memmove
. Это в основном учебное пособие, так как это не очень хороший способ манипулировать строками. Для коротких строк, где пространство не является проблемой, большинство программистов просто печатают нужную строку во временный буфер, избегая проблем с наложением.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* Insert a decimal numeral for Prefix into the beginning of String.
Length specifies the total number of bytes available at String.
*/
static void InsertPrefix(char *String, size_t Length, int Prefix)
{
// Find out how many characters the numeral needs.
int CharactersNeeded = snprintf(NULL, 0, "%i", Prefix);
// Find the current string length.
size_t Current = strlen(String);
/* Test whether there is enough space for the prefix, the current string,
and the terminating null character.
*/
if (Length < CharactersNeeded + Current + 1)
{
fprintf(stderr,
"Error, not enough space in string to insert prefix.\n");
exit(EXIT_FAILURE);
}
// Move the string to make room for the prefix.
memmove(String + CharactersNeeded, String, Current + 1);
/* Remember the first character, because snprintf will overwrite it with a
null character.
*/
char Temporary = String[0];
// Write the prefix, including a terminating null character.
snprintf(String, CharactersNeeded + 1, "%i", Prefix);
// Restore the first character of the original string.
String[CharactersNeeded] = Temporary;
}
int main(void)
{
char MyString[13] = "Hello World";
InsertPrefix(MyString, sizeof MyString, 2);
printf("Result = \"%s\".\n", MyString);
}