Executando verificação de segurança...
3

Vc pode usar as próprias opções do printf para formatar a quantidade de espaços e #:

int height = // ler valor e verificar se está entre 1 e 8
for (int i = 1; i <= height; i++)
    printf("%*s%.*s\n", height - i, "", i, "#########");

Saída para height igual a 8:

       #
      ##
     ###
    ####
   #####
  ######
 #######
########

Veja aqui o código rodando.

Referência: https://stackoverflow.com/questions/7105890/set-variable-text-column-width-in-printf


E pra ler a altura, nem precisa de uma função pra validar, pode ser apenas:

int height;
do {
    printf("height: ");
    scanf("%d", &height);
} while (height < 1 || height > 8);

Mas se quiser muito continuar com a função, dá pra simplificar:

int isBtw1And8(int size) {
    return size >= 1 && size <= 8;
}

Simplifiquei, pois sempre que vc tem algo como if (algo) return true; else return false;, pode trocar por return algo;.

E no main ficaria:

int height;
do {
    printf("height: ");
    scanf("%d", &height);
} while (! isBtw1And8(height));

Os códigos acima não validam se o usuário não digitar um número válido (por exemplo, se digitar "xyz"). E tem várias formas diferentes de fazer (veja este link e escolha uma) :-)


Por fim, daria para fazer assim também:

int height = // ler valor entre 1 e 8
for (int i = 1; i <= height; i++) {
    for (int j = 0; j < height; j++) {
        if (j < height - i) {
            printf(" ");
        } else {
            printf("#");
        }
    }
    printf("\n");
}
Carregando publicação patrocinada...
1

Se possível, eu mudaria para

printf("%*s%.*s\n", height - i, "", (i + (i-1)), "#################");

Pois acho o resultado final mais aesthetic.

1

Mas aí fica diferente do que foi proposto.

Repare que o código original imprime N vezes o caractere # na linha N, alinhado à direita, que é diferente do que vc fez.

Sei que no texto ele cita "pirâmide", e que na prática ele quer apenas metade dela, enquanto o seu código imprime a pirâmide inteira, mas enfim...