Como evitar o loop infinito no C

Olá eu tenho dúvidas em linguagem C.
Estou tentando executar esse programa abaixo, mas ele entra em loop infinito após eu digitar o um para continuar por várias vezes.
Por que não posso digitar 1, quantas vezes eu quiser, voltar na funcaod2, quantas vezes eu quiser???
#include <stdio.h>
#include <stdlib.h>

int d = 0;
float b;
float f;
float c;

void funcaod2() {

printf(“digite um numero: “);
scanf(”%f”, &b);

f = 2 * b;
c += f;
system(“cls”);
printf(“O valor total %.2f\n”, c);
printf(“Digite 1: “);
scanf(”%d”, &d);

while (d == 1) {

funcaod2();

} else {

exit(0);

}
}
}
int main() {

funcaod2();

return 0;
}

Bom dia Pessoal, me desculpe a falta de educação!!

Mas a respeito desse código, já me informaram diversos comandos que limpa o buffer, evita entrar no loop como o breack. Mas não resolve o problema, só sai do programa, cancelando o entra e sai da funcaod2!!!

Olá gabol!

Muito obrigado!

Copiei e colei seu código, mas continua entrando no loop. Ele começa a somar os últimos valores de f em c:

Ia colocar o passo a passo do resultado, mas só posso postar uma imagem.
Então a última!!

image

Vamos la

vc esta chamando o seu codigo de forma recursiva e vc tem uma variavel global que vc setou 1 anteriormente. eu mudaria o seu programa para evitar o loop while e evitar recursão. divida a sua logica entre uma função de leitura e uma função de controla o fluxo

alias: estude as funções que vc esta utilizando. por exemplo o scanf tem um detalhe interessante: em caso de sucesso ele retorna quantos elementos ele conseguiu escanear com sucesso da entrada de dados.

scanf ...

RETURN VALUE
       On success, these functions return the number of input items successfully matched and assigned; this can be fewer than provided for, or even zero, in the event of an early matching failure.

veja esse programinha

$ cat a.c
#include<stdio.h>
int main() {
  int i=0, j=0; 
  printf("digite algo: ");
  j = scanf("%d", &i);
  printf("scanf leu %d, retorna %i\n",i,j);
}

veja duas execuções

$ ./a.out 
digite algo: 4
scanf leu 4, retorna 1

$ ./a.out 
digite algo: lol
scanf leu 0, retorna 0

ou seja, vc pode usar o retorno de scanf para saber se leu com sucesso ou não. no caso vc espera receber 1 e vc pode fazer um laçodo { } while ( .... ); ate que vc leu algo util

só não faça chamadas recursivas com variaveis globais. vai ser bem dificil de controlar o estado.