o enunciado está um pouco estranho . Perceba: "um cilindro que preencha perfeitamente todo o seu espaço interior" e "calcular o volume que o cilindro deixou de preencher" são informações conflitantes , apesar de sabermos que não há como um cilindro preencher perfeitamente um cubo . Suponho que a idéia seja dizer que a altura do cilindro é a mesma do cubo. Se for o caso :
#include <stdio.h>
#include <stdlib.h>
int main()
{
float lado(0), volume_cubo(0), volume_cilindro(0),altura_cilindro(0), pi(3.14), raio(0);
printf("Digite a altura do cubo : \n");
scanf("%f", &lado);
// dado que o altura do cilindro = lado podemos fazer :
altura_cilindro=lado;
printf("Digite o raio do cilindro: \n");
scanf("%f", &raio);
volume_cubo = lado * lado * lado; // a variavel volume_cubo tem agora o valor do volume do cubo
printf("O volume do cubo vale: %f \n" ,volume_cubo);
volume_cilindro = 2*pi*raio * altura_cilindro; // O volume é dado pelo produto da área da base pela altura, sendo lado igual a altura
printf("O volume do cilindro vale: %f \n" ,volume_cilindro);
printf("O volume que o cilindro não preenche vale : %f " ,volume_cubo-volume_cilindro );
return 0;
}