Первый параметр strcat
должен быть модифицируемой строкой с достаточным пространством, выделенным для хранения результирующей строки и завершающего нулевого байта. Первый параметр strcpy
должен указывать на выделенную, модифицируемую память с достаточным пространством для хранения полученной копии строки и завершающего нулевого байта. В обоих ваших примерах вы передали константу в качестве первого параметра.
Вот пример кода, чтобы сделать то, что вы хотите:
char* SlashDotter(const char* in)
{ // turn <string> into <string>/.<string> -- caller must free returned string
char *out = malloc(strlen(in)*2 + 3); // two copies of input, /, ., and nul
strcpy(out, in);
strcat(out, "/.");
strcat(out, in);
return out;
}