Jump to content

Dúvida Scanf vs gets


Recommended Posts

Posted

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! 👍

Posted

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
Posted

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!

Posted (edited)

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

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

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!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.