Вы не можете выполнить прямую подстановку, потому что ваша строка (массив символов) недостаточно длинна для хранения pid, и, конечно, если она объявлена как строковый литерал, она также не является изменяемой.
Есть несколько способов, которыми вы могли бы воспользоваться этим, но вот довольно элегантный:
/* Modify the existing string to be a pattern string for snprintf */
int len = strlen(exampleString) - 1; /* Can you see why I might do this? */
char* formatString = strdup(exampleString); /* Because we can't modify a literal */
int newLen = len + 12; /* How about this? */
char *pidString = malloc(newLen);
int i;
for (i = 0; i < len; i++) {
if (formatString[i] == '$' && formatString[i+1] == '$') {
formatString[i] = '%';
formatString[i+1] = 'd';
break;
}
}
snprintf(pidString, newLen - 1, formatString, getpid());
Можете ли вы следить за тем, как это работает?
Как бы вы улучшили это, чтобы изящно завершиться неудачей, если exampleStringне содержит $$?