Pular para o conteúdo

scanf() e clear screen [RESOLVIDO]

Responder tópico
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
  • Denunciar
  • Indicar

1. scanf() e clear screen [RESOLVIDO]

Enviado em 08/03/2009 - 19:08h

Pessoal,

Adaptei esse programa, que é originário do manual de operações "TK 85 Programação Basic" da Microdigital (1983), do BASIC para o C inicialmente para DOS (ver linhas de comentários) e depois para Linux:

#include <stdio.h>
#include <stdlib.h>
int main()
{
char s1[] = "Posso contar uma piada?";
char s2[] = "Ok, nao conto.";
char s3[] = "Quantas pernas tem um cavalo montado?";
char s4[] = "Exato!";
char s5[] = "Nao, seis! Quatro do cavalo e duas do cavaleiro...";
//char str[2];
int str;
int number;
char imprime(char s[]);

//system("cls");
imprime(s1);
//scanf("%s", &str);
str = getchar();
if (str == 'N') { imprime(s2); }
else
{
imprime(s3);
scanf("%d",&number);
if(number == 6) { imprime(s4); }
else { imprime(s5); }
}
return 0;
}

char imprime(char s[])
{
printf("%s", s, " \n");
}

Dúvidas:
1 - Não consegui fazê-lo funcionar com a função scanf(). Como seria o correto com scanf()?
2 - Como apagar a tela? No DOS funcionou a função system() com o argumento "cls". E no Linux, como seria?

Desde já, agradeço a todos.

Luiz http://lcmoura.blogspot.com


Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

2. Re: scanf() e clear screen [RESOLVIDO]

Enviado em 08/03/2009 - 19:26h

Para ler um caracter: scanf("%c",&str);

Limpar tela: system("clear");

3. É assim

Enviado em 08/03/2009 - 19:30h

Fiz esse pequeno programinha para exemplificar como se usa o scanf() e também como limpar a tela do terminal.
[]'s

#include <stdio.h>

int main(void){
int x;
printf("Digite o valor de X\n");
scanf("%d",&x); /* Usando o scanf() para pegar o valor de um número inteiro */
printf("\e[H\e[2J"); /* printf() para limpar a tela */
return 0;
}

4. Re: scanf() e clear screen [RESOLVIDO]

Enviado em 08/03/2009 - 19:36h

Refiz ele pra vc:

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

char imprime(char s[]);

int main(){

int str;
int number;
char s1[] = "Posso contar uma piada?\n";
char s2[] = "Ok, nao conto.\n";
char s3[] = "Quantas pernas tem um cavalo montado?\n";
char s4[] = "Exato!\n";
char s5[] = "Nao, seis! Quatro do cavalo e duas do cavaleiro...\n";


printf("\e[H\e[2J");
imprime(s1);
scanf("%s", str);
str = getchar();
if(str == 'N'){
imprime(s2);
}
else{
imprime(s3);
scanf("%d",&number);

if(number == 6){
imprime(s4); }
else{
imprime(s5);
}

}

return 0;
}

char imprime(char s[])
{
printf("%s", s, " \n");
}

5. Re: scanf() e clear screen [RESOLVIDO]

Enviado em 08/03/2009 - 20:13h

A sintaxe da função scanf é a seguinte:

int scanf ( const char *format, ... );

Isso significa que tudo o que você coloca ali tem que ser convertido para ponteiro. Strings em C são consideradas arrays (vetores de caracteres). E os vetores comuns são quase iguais aos ponteiros.

Não sei se estudou sobre ponteiros ou nao, então vou so colocar pra você como fazer.

Quando você for usar scanf() com arrays e ponteiros, você nao usa o '&' (e comercial).
Quando você for usar scanf() para variaveis normais, você usa o '&'.

int decimal;
scanf ("%d", &decimal);

char *decimal;
scanf ("%s", decimal);

int vetor[10];
scanf("%d", vetor);

int vetor[10];
scanf ("%d", &vetor[5]);

Espero ter ajudado, para entender o porque do uso ou nao do '&' você precisa estudar sobre ponteiros.

[]'s
Slackware_10


6. scanf()

Enviado em 09/03/2009 - 07:05h

Dúvidas:

1 - Testei o seguinte:
char s1[] = "..texto..";
scanf("%s", str); (Com ponteiro e vetor não se usa o &, certo?)
mas não deu certo. Se usasse o s1[] sem atribuir o texto, teria que definir o tamanho do vetor e colocar o asterisco da seguinte forma:
char *s1[10]; ?
Ainda não estudei os ponteiros.

2 - Não entendi a dica de adicionar
str = getchar();
A idéia era usar scanf() ou getchar(). Ambos ao mesmo tempo é correto?

Pessoal, agradeço muito sua atenção.

7. Re: scanf() e clear screen [RESOLVIDO]

Enviado em 09/03/2009 - 08:45h

Seguem as respostas:

1- Se você declara str como um vetor de caracteres, o modo correto de escrever seu scanf seria:

char str [3];

scanf ("%2s", str);

Basta lembrar que o identificador de um vetor em C é um apontador para o início do vetor. Portanto, não é necessário extrair o apontador para str através do operador &, o que causará um erro em tempo de execução.

A máscara "%2s" garante que somente 2 caracteres serão lidos na sua string. É importante declarar o seu vetor para suportar 3 caracteres para que se possa suportar o terminador de string. Caso contrário, haverá um pequeno buffer overrun na sua aplicação.

2. cls é um comando puramente DOS. Para limpar a tela do seu terminal linux, você pode fazer de duas formas: olhar o database de capacidades do seu terminal e verificar qual seqüência de escape limpa a sua tela (Esc[2J é a sequência de escape para o terminal VT100). Isso pode ser conseguido com a seguinte estrutura de código (o caractere de escape normalmente é o 0x1B:

printf ("\x1b[2J");

Outra forma é verificar alguma função na termios.h que faça o truque. Note que em ambientes linux/unix é necessário controlar o terminal para realizar esse tipo de coisa. Uma outra maneira é um truque sujo que era usado antes do aparecimento do database de capacidades dos terminais (termcap):

int i;
for (i=0; i<25; ++i) printf ("\n");

Essa forma não é recomendada, pois com o advento das interfaces gráficas os terminais podem ter mais do que somente 25 linhas. Em mil novecentos e antigamente esse era um método válido pois os terminais eram baseados em caractere e tinham apenas 24 linhas (no caso dos terminais com status bar ativada), ou 25 linhas no caso dos terminais VT100.

8. scanf()

Enviado em 09/03/2009 - 20:57h

Pessoal,

Funcionou dessa forma:

#include <stdio.h>
#include <stdlib.h>
char imprime(char s[]);

int main()
{
char s1[] = "Posso contar uma piada?";
char s2[] = "Ok, nao conto.";
char s3[] = "Quantas pernas tem um cavalo montado?";
char s4[] = "Exato!";
char s5[] = "Nao, seis! Quatro do cavalo e duas do cavaleiro...";
int str;
int number;

system("clear");
imprime(s1);
str = getchar();
if (str == 'N') { imprime(s2); }
else
{
imprime(s3);
scanf("%d",&number);
if(number == 6) { imprime(s4); }
else { imprime(s5); }
}
return 0;
}

char imprime(char s[])
{
printf("%s", s, " \n");
}

Com char str[3]; ... scanf("%2s", str); não funcionou! ele não lê o N, isto é, não imprime s2, mas roda os comandos após o else.
Outra coisa: em nenhum dos casos, ele coloca uma nova linha - exceto se colocar o \n dentro das strings. Porque ele não o faz com printf("%s", s, " \n"); ?

9. scanf()

Enviado em 09/03/2009 - 22:20h

Pessoal, com

scanf("%s", str);
printf("%s...\n", str);

verifiquei que a string é N mesmo se digito N, mas então o problema está em
if (str == "N") { imprime(s2); } ?

porque não resulta em verdadeiro, isto é, não roda imprime(s2), mas só o que está em else

Outra "descoberta":
usando
printf("%s\n", s);

não preciso colocar \n nas strings e new line ocorre.

Não sei se mencionei, mas o system("clear") funcionou no Linux, assim como system("cls") funciona no DOS.

Estou aprendendo bastante com vocês e com minhas tentativas e erros.
Valeu!


10. scanf()

Enviado em 10/03/2009 - 21:54h

Pessoal,

Consultando o Curso de C da UFMG, http://www.ead.cpdee.ufmg.br/cursos/C/c.html
encontrei uma solução:

#include <stdio.h>
#include <stdlib.h>
char imprime(char s[]);

int main()
{
char s1[] = "Posso contar uma piada?";
char s2[] = "Ok, nao conto.";
char s3[] = "Quantas pernas tem um cavalo montado?";
char s4[] = "Exato!";
char s5[] = "Nao, seis! Quatro do cavalo e duas do cavaleiro...";
char str[2];
int number;
system("clear");
imprime(s1);
scanf("%s", str);
if (str[0] == 'N') { imprime(s2); }
else
{
imprime(s3);
scanf("%d",&number);
if(number == 6) { imprime(s4); }
else { imprime(s5); }
}
return 0;
}

char imprime(char s[])
{
printf("%s\n", s);
}

De qualquer forma, valeu pelas dicas - terei muitas outras dúvidas e conto com vocês.

11. Re: scanf() e clear screen [RESOLVIDO]

Enviado em 20/04/2009 - 05:05h

verifiquei que a string é N mesmo se digito N, mas então o problema está em
if (str == "N") { imprime(s2); } ?


Olá amigo,

O 'problema' que está acontecendo ai é que você nao pode comparar com '==' uma string. Mesmo se for um caractere apenas, o computador encara como uma string. E para comparação de strings, existe uma função propria:

int strcmp ( const char *a, const char *b );

Ela retorna:

0 - 'a' igual a 'b'
1 - 'a' maior que 'b'
-1 - 'a' menor que 'b'

Agora é só usar:

...
scanf ( "%s", str );
if ( !(strcmp (str, "VOL") ) printf ( "Viva o Linux\n" );
else printf ( "Não viva o linux :( \n" );
...

Espero ter ajudado,
Slackware_10
[]'s

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Responder tópico

Entre na sua conta para responder.

Fazer login para responder