duvida bem amadora no while

1. duvida bem amadora no while

Daniel
danielcrvg

(usa Slackware)

Enviado em 08/04/2014 - 11:41h

Opa e ai galera blz?? To com uma duvida bem amadora... Eu queria saber por que quando eu rodo as simples instrucoes nao ta me pedindo de novo pra digitar o textoPuro?? Tipo ele pede 1 vez, ai eu coloco a resposta porem na hora de fazer o loop, ele volta a me pedir a resposta.. ele nao deveria perguntar de novo o textoPuro???

Eu tentei com o do{}while(); porem deu no mesmo erro...

Obrigado,

Daniel.
[code]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main () {

int resp = 1;
char textoPuro[200];

while (resp == 1) {

printf("Digite a mensagem: ");
fgets(textoPuro,200,stdin);


printf("\nDeseja continuar: ");
fflush(stdin);
scanf("%d",&resp);

}

return 0;
}
[\code]


  


2. Re: duvida bem amadora no while

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/04/2014 - 13:59h

A dificuldade não é com o while, mas sim o velho problema de “lixo” no buffer de entrada, com a solução imperfeita (e, no seu caso, colocada no lugar errado) de usar “fflush(stdin)”.

Abaixo, eu listo quatro formas alternativas de consertar ou contornar o problema.

1) mover o famigerado fflush(stdin) para o ponto certo do código (a saber: depois da chamada a scanf() e antes do próximo fgets());

Eu chamo de "famigerado" porque é uma solução que não tem garantia de funcionar. O padrão do C só define o comportamento de fflush() para streams de saída, e stdin é um stream de entrada. Vários sistemas, incluindo versões antigas do Linux, não suportam fflush(stdin), e mesmo as versões que o suportam o fazem por causa da compatibilidade com antigos compiladores para MS-DOS de uma época anterior ao primeiro padrão do C, a qual eu considero também inadequada.


2) colocar “scanf(" ")” antes da chamada a fgets() (mas tem o problema de que você não vai conseguir ler uma mensagem começando com espaços, nem uma mensagem vazia);

3) usar de modo mais completo a função scanf() (que é uma função muito complexa, cuja documentação precisa ser muito bem lida para que se possa fazer dela bom proveito), testando seu valor de retorno (algo que sempre deveria ser feito!) e fazendo-a detectar e desprezar dados inválidos na entrada;

int cont;
int a, b;

printf("Deseja continuar (1=sim, 2=nao)? ");
if(scanf("%d%n%1*[\n]%n", &cont, &a, &b)==1 && b>a){
/* leitura bem sucedida e quebra de linha ja consumido */
/* ... algum codigo usando o valor lido de ‘cont’ ... */
}
else{
/* leitura falhou por algum motivo */
/* ... algum codigo para tratar a falha ... */
}


4) ler sempre linhas inteiras como strings, e extrair informações a partir da linha lida com a função sscanf().

int cont;
char line[MAX_LINE_SIZE];

printf("Deseja continuar (1=sim, 2=nao)? ");
if(fgets(line, MAX_LINE_SIZE, stdin)!=NULL && sscanf(line, "%d", &cont)==1){
/* leitura bem sucedida */
}



3. Re: duvida bem amadora no while

Eduardo
ehammo

(usa Ubuntu)

Enviado em 15/04/2014 - 22:38h

oi cara pq vc nao tenta zerar o texto puro no inicio do while?
//comecao o while
//zero o texto pura
//pede o texto puro
//le o texto puro(use scanf() eh melhor e mais facil se nao sabe usar explico no final)
//pergunta se quer continuar






como usar o scanf


scanf("%*", &x) *=tipo da variavel(float=f,double=b,int=i,string=s,char=c) x=varialvel no seu caso seria scanf("%c", &TextoPuro[i]) e usa um for pra rolar a matriz:

for(int i=0;i<200;i++){
scanf("%c", &TextoPuro[i])
}


4. Re: duvida bem amadora no while

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/04/2014 - 13:32h

O uso eficiente de scanf() é muito mais complicado do que supõe o ehammo. Eu considero mesmo perigoso fazer uma sinopse como a que ele fez (“scanf("%@", &var)”, trocando o “@” por diferentes letras dependendo do tipo da variável var) porque essa sinopse desconsidera as particularidades de cada conversão (por exemplo: "%c" não ignora espaços em branco; "%s", além de geralmente prescindir do operador & antes do símbolo que indica a string e do potencial que tem para causar buffer overflow, tem outras limitações que a tornam desaconselhável em diversos casos).

A manpage do Linux para a função scanf() é excelente. Recomendo fortemente sua leitura, advertindo que não pode ser uma leitura ligeira, mas deve atenta e cuidadosa. Melhor ainda se quem ler puder fazer uns testes por conta própria para fixar o funcionamento de pontos que ficarem obscuros.

Por fim, ler a mensagem do jeito por ele sugerido é computacionalmente caro, pois chama uma função complexa para ler caráter a caráter aquilo que se sabe que deve ser uma linha de texto. Aliás, o loop nem testa pelo final da linha como condição de parada. Se fosse para ler caráter a caráter -- o que eu não recomendo! --, seria melhor usar fgetc().

char TextoPuro[MAX_TEXT_SIZE+1];
int i;

int ch; /* Sim, aqui tem de ser int, para poder acomodar EOF. */

i=0;
while(
i<MAX_TEXT_SIZE &&
(ch=fgetc(stdin))!=EOF && ch!='\n'
){
TextoPuro[i++]=ch;
}

TextoPuro[i]=0;



5. Re: duvida bem amadora no while

Daniel
danielcrvg

(usa Slackware)

Enviado em 22/04/2014 - 18:53h

Muito obrigado professor.... eu nao recebi os emails informando que alguem tinha respondido!! mas depois eu vou ler com calma as explicacoes de qualquer forma muito obrigado mesmo!!

abraco

Daniel.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts