Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Guest Markito

Dúvida Scanf vs gets

Mensagens Recomendadas

Guest Markito

Muito boa tarde

Tenho uma dúvida (jura! dizem vocês...) entre o gets e o scanf.

vejam o código:

#include <stdio.h>

int main()
{
 char string[100];
 printf("Escreva uma frase qualquer...\n");
 scanf("%s",&string);
 printf("A frase escrita foi:\n%s",string);
 return 0;
}

e vejam também este:

#include <stdio.h>

int main()
{
 char string[100];
 printf("Escreva uma frase qualquer...\n");
 gets(string);
 printf("A frase escrita foi:\n%s",string);
 return 0;
}

Se eu escrever o nome: Maria Antonieta, no programa do scanf só me retorna "Maria" e no programa de baixo já me retorna tudo: "Maria Antonieta".

Isto acontece por algum motivo? Se sim, qual é?

Obrigado pelo vosso apoio! :thumbsup:

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

primeiro de tudo, não uses o gets

e eu deu-te uma razão muito clara :

#include <stdio.h>

int main()
{
 char str[8];

 gets(str);           // imagina que eu escrevi o alfabeto
 printf("%s\n", str);

 return 0;
}

sabes onde o programa vai escrever os caracteres que não cabem na string de 8 espaços ?

pois ... com sorte, somente será em cima de outros dados

se tiveres azar, vais ter um acesso inválido de memória e o programa estoira.

a função a usar é o fgets

#include <stdio.h>

int main()
{
 char str[8];

 fgets(str, 8, stdin);
 printf("%s\n", str);

 return 0;
}

bem podes escrever o que quiseres, mas nunca será lido mais do que os caracteres especificados no argumento da função.

----------------

agora vamos lá ao que interessa

scanf("%s") lê um conjunto de caracteres até encontrar um caracter que seja considerado de espaço (espaço, uma tabulação, um caracter de fim de linha, etc ...) e para antes de ler esse caracter (esse caracter fica à espera de ser lido)

enquanto que o fgets lê até encontrar um caracter de fim de linha, inclusive. logo, lê os espaços, tabulações, etc.

nota que o caracter de fim de linha também é lido e é guardado na string dada como argumento da função !!


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Markito

Sim... desta vez compreendi tudo.

"...nota que o caracter de fim de linha também é lido e é guardado na string dada como argumento da função !!" - estás a falar do caracter terminador nulo, verdade? parece que já registei isso: se quisermos ler o nome Joao temos que guardar [5] de espaço. O ultimo é para o terminador nulo ou caracter de fim de linha como lhe chamas.

já agora o que quer dizer o (stdin) que colocas-te na função fgets???

Muito obrigado pela resposta!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o caracter fim de linha não e o que chamas de nulo, que realidade é o caracter '\0' que normalmente tem o valor de 0 (que por acaso também é o valor normal de NULL)

o caracter '\0' é o caracter que deverá existir no fim da string para determinar o fim da string

o caracter de fim de linha é o '\n'. este caracter (ou conjunto de caracteres, depende da codificação/sistema operativo) sinaliza que a linha acabou e o caracter seguinte se situa na linha seguinte

exemplos:

char * t1 = "teste";   // caracteres : {'t', 'e', 's', 't', 'e', '\0'}
char * t2 = "teste\n"; // carecteres : {'t', 'e', 's', 't', 'e', '\n', '\0'};

se fizeres output da string verás o significado do '\n':

char * t1 = "-\n-";
printf("%s", t1);

output

-
-

-------

stdin significa "o stream de entrada de dados por defeito"

normalmente é o teclado

vais aprender isso mais tarde

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Markito

Eu até já sabia para que servia o \n - "pular" a linha como diz no meu pdf. Embaraçei-me com as palavras, creio...

Muito obrigado pelo teu apoio!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.