Вы бы использовали sprintf
для создания объединенной строки. Конечно, дело в том, чтобы узнать длину номера. Что ж, мы можем использовать для этого локальный массив, а затем скопировать его в последнюю строку.
Что-то вроде
// reserve 4 characters for each octet in the `int`
char num_string[sizeof num * CHAR_BIT / 2];
// sprintf returns the length of the string!
int num_len = sprintf(num_string, "%d", i);
// size of char is exactly 1
char *new_string = malloc(strlen(original) + strlen(prefix) + num_len + 1);
// then concatenate all with one sprintf
sprintf(new_string, "%s%s%s", num_string, prefix, original);
Конечно, если вам повезло использовать Glibc и сказать Linux; или, возможно, BSD, и вам не нужно писать везде, вы можете использовать только asprintf
:
// must be before the include
#define _GNU_SOURCE
#include <stdio.h>
char *new_string;
asprintf(&new_string, "%d%s%s", i, prefix, original);
Это соответствует 4 строкам выше.
Обратите внимание, что ваш первоначальный подход strcpy
x3 также потерпел бы неудачу; strcpy
всегда перезаписывать, начиная с первого символа в целевом буфере; звонки должны были быть strcpy
, strcat
, strcat
.