Guest Markito Posted February 17, 2013 at 05:40 PM Report #495853 Posted February 17, 2013 at 05:40 PM 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! 👍
HappyHippyHippo Posted February 17, 2013 at 05:49 PM Report #495855 Posted February 17, 2013 at 05:49 PM 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 Portugol Plus
Guest Markito Posted February 17, 2013 at 06:25 PM Report #495862 Posted February 17, 2013 at 06:25 PM 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!
HappyHippyHippo Posted February 17, 2013 at 06:39 PM Report #495864 Posted February 17, 2013 at 06:39 PM (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 February 17, 2013 at 06:48 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Guest Markito Posted February 17, 2013 at 07:26 PM Report #495873 Posted February 17, 2013 at 07:26 PM 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!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now