scanf() e clear screen [RESOLVIDO]

1. scanf() e clear screen [RESOLVIDO]

Luiz Carlos de Moura
lcmoura

(usa Ubuntu)

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




  


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

Perfil removido
removido

(usa Nenhuma)

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

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

Limpar tela: system("clear");


3. É assim

Gabriel Duarte Guimarães Costa
gabrield

(usa Debian)

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]

Gabriel Duarte Guimarães Costa
gabrield

(usa Debian)

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]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

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()

Luiz Carlos de Moura
lcmoura

(usa Ubuntu)

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]

Ronaldo Faria Lima
ron_lima

(usa Slackware)

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()

Luiz Carlos de Moura
lcmoura

(usa Ubuntu)

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()

Luiz Carlos de Moura
lcmoura

(usa Ubuntu)

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()

Luiz Carlos de Moura
lcmoura

(usa Ubuntu)

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]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

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