Ваша writeSpace
функция не возвращает новую строку (даже если вы объявили ее таким образом), но пишет напрямую в терминал. Так как вы вызываете его как аргумент в вашем printf
вызове, сначала вызывается writeSpace
, печатает его содержимое, а затем printf
печатает его содержимое. Вы должны сделать это так:
char* writeSpace(int i)
{
char *ret = NULL;
asprintf(ret, " " + (30-i));
return ret;
}
Конечно, это требует от вас free
памяти (в противном случае у вас будет утечка памяти). Вы можете сделать это так:
char *spaces = writeSpace(10);
printf("%s%i", spaces, 42);
free(spaces);
Альтернативой является использование статической переменной, которую сама функция очищает при следующем вызове:
char* writeSpace(int i)
{
static char *ret = NULL;
if (ret != NULL) free(ret);
asprintf(ret, " " + (30-i));
return ret;
}
Но это имеет тот недостаток, что вы можете использовать только один вызов writeSpace
в ваших аргументах printf
, так как второй очистит память предыдущего вызова. Все еще может быть то, что вы хотите.
Кстати, + (30-i)
часть зла. То, что вы, вероятно, хотите, это вместо этого:
asprintf(ret, "%*s", i, ""); // Prints i spaces