Comando while não esta funcionado corretamente

1. Comando while não esta funcionado corretamente

Caio Camnho
caiocamanholopes

(usa Slackware)

Enviado em 12/05/2018 - 14:29h

Ola.
Escrevi com o vim um programa bem simples em c.
Codigo
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char dc[1];
strcpy(dc,"s");
while (strcmp(dc,"s")==0 || strcmp(dc,"S")==0)
{
printf("Qualquer coisa\n\n\n");


printf("Para continuar digitar S ou N:\t");
fflush(stdin);
scanf("%c", &dc);
system("clear");
}
}
Então ele imprimir as duas frase na tela, quando digito o S e dou enter ele imprimi novamente e sai do programa.
Nao estou sabendo acha o problema.
Se algum pode me ajudar.
Agradeço
Desde ja grato
.



  


2. Re: Comando while não esta funcionado corretamente

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/05/2018 - 00:53h

caiocamanholopes escreveu:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char dc[1];


Um array de uma posição é um desperdício. Não acha que seria melhor ter uma única variável do tipo char?

strcpy(dc,"s"); 


Quando você faz isso, está gravando dois bytes (um para o caráter s e um byte nulo, que marca o final da string) num array que só tem espaço para um. Isso é um erro grave, cujo impacto sobre a execução do programa é imprevisível.

while (strcmp(dc,"s")==0 || strcmp(dc,"S")==0) 


Aqui, de modo semelhante, a função strcmp() acaba acedendo ao segundo elemento do array (ao tentar localizar o fim da string), o que continua sendo inválido.

     {
printf("Qualquer coisa\n\n\n");


printf("Para continuar digitar S ou N:\t");
fflush(stdin);


O padrão da biblioteca do C define o funcionamento de fflush() apenas para streams de saída de dados. Como stdin é um stream de entrada de dados, seu programa pode simplesmente não funcionar ao ser levado para uma máquina diferente da sua.

         scanf("%c", &dc); 


Sendo dc um array (não deveria ser mas, como você o fez assim, respondo de acordo com o código), você não deve usar o operador de obtenção de endereço, pois arrays em C decaem automaticamente para ponteiros para o primeiro elemento quando usados em expressões que não envolvam os operadores de obtenção de endereço (&) e de cálculo de tamanho (sizeof).

Adicionalmente, uma forma de eliminar aquele fflush(stdin) seria simplesmente colocar um espaço na string de formatação, antes da especificação de conversão “%c”.

         system("clear");
}
}



3. Re: Comando while não esta funcionado corretamente

Diego Mendes Rodrigues
diegomrodrigues

(usa Ubuntu)

Enviado em 14/05/2018 - 15:26h

Caio,

Criei um while que sempre esté em execução, usando while (1).
O teste para sair dele coloquei no if ().
Ao invés de utilizar o strcmp() utilizei o valor ASCII do S e do s (83 e 115).
Veja também a forma que criei a variável dc.

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

int main()
{
char dc;
while (1)
{
printf("Qualquer coisa\n\n\n");

printf("Para continuar digitar S ou N:\t");
scanf(" %c", &dc);

//printf("%d",dc);

if ( dc == 83 || dc == 115 ) {
system("clear");
fflush(stdin);
} else {
break;
}
}
}


Att, Diego


4. Re: Comando while não esta funcionado corretamente

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/05/2018 - 15:59h

diegomrodrigues escreveu:

Ao invés de utilizar o strcmp() utilizei o valor ASCII do S e do s (83 e 115).


Nessa parte, você tornou o programa menos legível.

Constantes de caracteres e strings no meio do programa fazem mais sentido para quem lê o programa do que números isolados.



  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts