Ir ao conteúdo
  • Cadastre-se

Posts recomendados

Postado

Dado feito em linguagem C. 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main ()
{
	int dado;
	char x[2];
	
	while(1)
	{
		__fpurge(stdin);
		gets(x);
		srand(time(NULL));
		dado = 1 + (rand() % 6);
		printf("\nDado: %d", dado);
		if(x[0] != 0)
			return;
	}
}

 

  • Curtir 1
  • Amei 1
Postado

@Daniel13    esse seu código não está compilando ,  não sei por que você postou ele e não disse nada do que queria , mas corrigido ele poderia ser assim  :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main()
{
  srand(time(NULL));      // só precisa huma vez no código Todo
  int dado;
  char x[2];
  while(1)
  {
    //__fpurge(stdin);  // esse não consta da linguagem c
    fflush(stdin);      // esse sim , mas em muitos casops não resolve
    printf("Huma Palavra ");
    gets(x);
    printf("voce digitou %s\n",x);
    dado = rand() % 6 + 1;
    printf("\nDado: %d", dado);
    if(x[0] != '0')     //  caractere entre aspas simples
      return 16384;
  }
}

 

  • Curtir 2
Postado

Compila e funciona sim, foi programado no linux. Todas as funções estão corretas. Só postei pra quem quiser usar, ou ver um exemplo de como fazer. Mas obrigado pela reposta.

  • Curtir 1
  • Amei 1
Postado

O If está comparando o primeiro elemento de uma cadeia de char com número.

 

A variável x também pode ser int.

 

int main (){
    int dado;
    int x;

    while(1){
        srand(time(NULL));
        dado = 1 + (rand() % 6);
        scanf("%d", &x);
        printf("Dado: %d\n", dado);
        if(x != 0) break;
    }
    return 0;
}

 

  • Curtir 2
Postado

 

 

 

5 horas atrás, Daniel13 disse:

Compila e funciona sim, foi programado no linux. Todas as funções estão corretas. Só postei pra quem quiser usar, ou ver um exemplo de como fazer

 

Daniel, 

 

Não postou nenhuma dúvida e não fez qualquer pergunta então imagino que tenha postado seu programa apenas como exemplo num forum público como é aqui

 

Supondo que seja apenas um exemplo vou dizer algumas coisas sobre seu programa

 

image.png.069eb5a39473cd12d15819cb09c0276d.png

 

int dado;


O valor de dado é recalculado a cada vez dentro do loop e não é mais usado. Não há razão para aparecer 3 vezes no programa. Podia sumir


char x[2];


Usa x apenas para ler do teclado e aí ou errou simplesmente, como @devair1010 tentou te dizer. Como o valor de dado vai estar entre 1 e 6 provavelmente achou que seria uma boa usar '0' para encerrar o programa.
 

Até aí tudo bem, mas podia avisar o infeliz que está rodando o programa que é pra

Citação

"Digite '0' para encerrar"


Se é que era o que pretendia. Me desculpe se não era o caso e o erro era outro. Como não disse provavelmente o usuário vai acabar digitando Control-C para encerrar o programa. E não seria nada demais. Note que ele também precisa adivinhar que o programa continua rodando e "jogando" dados, porque o programa nada diz. Só muda de linha e fica lá parado.
 

E se o programa tivesse avisado você teria talvez testado melhor e percebido que comparou com zero um campo que foi lido via gets(). O retorno de gets() era char*. Mas vai ler ao menos o '\n' e retornar 10. NUNCA vai ler 0. Você devia ter escrito '0' ou o equivalente em decimal, 48.


__fpurge()


Não sei de onde desenterrou isso, mas isso é obsoleto há décadas e não devia ser usado. Veja o que diz o manual:
 

image.png.d5c55d16375485acfbb43685da22c3ec.png

 

Para ter a referência em dois idiomas:
 

Citação

Essas funções --- fpurge() e __fpurge() --- não fazem parte do padrão e não são portáveis. A função fpurge() foi introduzida no BSD 4.4 e não está disponível no Linux. A função __fpurge() foi introduzida no Solaris --- da Sun, Oracle há uns dez anos --- e está presente em glibc 2.1.95 e posterior.

NOTES: em geral é um erro querer descartar dados em buffers de entrada. 

 

gets(x)

 

Essa função é obsoleta e condenada e não deve ser usada de jeito nenhum. Use 

    char *fgets(char *str, int n, FILE *stream)


e escreva

        fgets( x, 2, stdin ); 


como alternativa mais inteligente e que funciona em sistemas das últimas décadas.


Mais uma vez, do manual
 

image.png.cf4314cc3f669ec88882751bebac8a84.png

 

Citação

 

LSB --- Linux Standard Base --- e POSIX.1-2008 definem gets() obsoleta. ISO C11 --- de 2011 --- removeu a especificação de gets() da linguagem C e, desde a versão 2.16, os arquivos de header da glibc não expõem a declaração dessa função se a macro  _ISOC11_SOURCE estiver definida --- e seria bom estar, afinal estamos em 2020.
 

Nunca use gets(). Porque é impossível saber previamente quantos caracteres gets() vai ler, e porque gets() vai continuar a armazenar caracteres  depois do fim do buffer, é extremamente perigoso --- e continua.

 


Seu buffer tem DOIS bytes. :) 

 

srand(time(NULL))


@Midorialertou você: a chamada está no lugar errado. Você roda isso no início, fora de qualquer loop, para reiniciar a sequência de valores a ser retornada por rand(), isso se for importante para você, por exemplo se precisar reproduzir a série.

    dado = 1 + (rand() % 6);
    printf("\nDado: %d", dado);

Nesse caso isso é redundante. dado não é processado exceto nessas duas linhas..

 

if(x[0] == 0 ) return;


OK, não está errado mas não vai acontecer nunca. gets() nunca retorna zero, isso em uma máquina que aceite gets().

 

O que podia ter feito?
 

Algo mais simples, tipo
 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main ()
{
        srand(time(NULL));
        printf("Tecle Control-C para encerrar\
ou ENTER para continuar\n");
        while(1)
        {
                printf("\nDado: %d", 1 + rand()%6);
                fgetc(stdin);
        };
}

 

  • Curtir 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...