Ir para o conteúdo
Guest tsenart

[C] Como usar o scanf com strings

Mensagens Recomendadas

Guest tsenart   
Guest tsenart

O pessoal queixa-se muito do scanf pois supostamente não dá para ler strings com espaços e outros caracteres.... Isto é um mito.

Pois bem...

Como podem experimentar em vez de usarem o %s e usarem o %[^\n] podem ler uma string. O que isto faz é ler uma cadeia de caracteres até encontrar um caracter da lista de caracteres(\n neste caso). Se quiserem limitar o tamanho da string a ler usam o limitador atrás dos parênteses rectos (ex: %60[^\n]).

Este modo de ler strings é melhor que o fgets(), na minha perspectiva, pois o fgets() não descarta o \n (New Line), o que se pode tornar muito chato.

EDIT:

Para limpar o buffer de entrada, podem usar estas duas chamadas à função scanf().

scanf("%*[^\n]"); scanf("%*c");

Triton: A tabela de especificadores em cima é referente ao scanf e printf. O %n funciona com o printf do seguinte modo (exemplo):

#include <stdio.h>

int main()
{
   int n, tmp;
   printf("Hello%n\n", &n);
   tmp = n;
   printf("Nº de chars escritos até agora: %d\n", tmp);
   printf("World!%n\n",&n);
   tmp += n;
   printf("Nº de chars escritos até agora: %d\n", tmp);
   return 0;
}

Output:

Hello
Nº de chars escritos até agora: 5
World!
Nº de chars escritos até agora: 11

Artigo no wiki em http://wiki.portugal-a-programar.pt/dev_geral:c:scanfparastrings

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HecKel    52
HecKel

Porreiro :D

Sempre fica aqui um resumo de como usar o scanf :)

Bom trabalho, se puderes, completa mais o post com outras informações das funcionalidades do scanf :P

abraços, HecKel

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Hipnoted    6
Hipnoted

Porreiraço o post!! :D

Isto pode ser referência para muita gente por isso podia-se mudar o título do tópico para um do tipo "Como usar o scanf" ou algo do género.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Guest tsenart   
Guest tsenart

Eu não pretendo fazer um tutorial da função scanf... Para isso usem as man pages. Isto foi só para esclarecer aquela dúvida de como ler strings em C com o scanf.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

Excelente post, aprendi dois especificadores que não conhecia.

Já agora, após uma consulta rápida à bíblia C in a Nutshell, o especificador %n não lê qualquer input, apenas atribui o número de caracteres lidos ao inteiro especificado. Não tinha percebido isso muito bem depois de ler o teu post...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Guest tsenart   
Guest tsenart

Bem... Já agora vou pôr aqui duas chamadas à função scanf que limpam o buffer.

scanf("%*[^\n]"); scanf("%*c");

A primeira chamada lê e descarta, ou seja, retira todos os caracteres que eventualmente existam no armazenamento tampão de entrada(buffer), até ao aparecimento do caracter '\n'. A segunda chamada lê e descarta um caracter apenas que, devido à instrução anterior, é o caracer '\n'. Logo, recorrendo a estas duas instruções, todos os caracteres da linha que estava a ser processada foram descartados. Consequentemente, foi lida uma linha completa do armazenamento tampão(buffer) de entrada e a posição de leitura ficou colocada no inicio da linha seguinte.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Craftsoul    0
Craftsoul

So falta acrescentar, digamos um pormenor teorico do proposito disso!

Isso é uma funcionalidade do scanf que permite o uso de Expressoes Regulares (http://pt.wikipedia.org/wiki/Express%C3%A3o_regular) como padrao de leitura.

Tal como ja foi explicado, [^\n] faz "match" com uma classe de caracteres que nao contenham o \n.

Mais informaçao sobre ER pode ser vista aqui http://www.regular-expressions.info/

Ou uma lista com as varias regras das ER aqui http://www.regular-expressions.info/reference.html

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nata79    0
nata79
Para limpar o buffer de entrada, podem usar estas duas chamadas à função scanf()

Código

GeSHi ©:

scanf("%*[^\n']"); scanf("%*c");

Created by GeSHI 1.0.7.20

aqui acho que se pode simplesmente fazer:

scanf("%*[^\n]\n");

e poupa-se uma chamada á função!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

Ou mesmo:

scanf("%*[^\n]%*c");

Queria perguntar se toda a gente consegue limpar o buffer com este código. É que a mim compila, mas não limpa o buffer. Pode ser erro meu, mas queria confirmar.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
André Aparicio    0
André Aparicio

Queria perguntar se toda a gente consegue limpar o buffer com este código. É que a mim compila, mas não limpa o buffer. Pode ser erro meu, mas queria confirmar.

Já tentei várias formas para passar aquilo para um único scanf como essa última e nenhuma limpa o buffer, parece que só mesmo com os dois scanf's.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Marfig    0
Marfig

hmmm...

while (getchar() != '\n');

// ou

while (scanf("%c") != '\n');

Ambas limpam o buffer. Não conheço nenhuma forma no ISO C de o limpar sem testar pelo null terminator. A não ser que usem gets()

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1132
HappyHippyHippo

fflush(strdin);

não resolve?

antes de mais, está mal escrito

fflush(stdin);

segundo, essa solução funciona no windows e no linux, mais devido ao número de "pedidos" para tal. não é uma solução ISO C.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Richard597    0
Richard597

testei

scanf("%*[^\n]"); scanf("%*c"); e scanf("%*[^\n]%*c");

Mas não resolveu ( não limpou o buffer), aliás, obtive resultados interessantes... Uso o compliador GCC no Ubuntu e o que funciona para limpar buffer do teclado é a função __fpurge(). Ou seja, usa-se o seguinte:

__fpurge(stdin); //limpa buffer do teclado sem falha, pelo menos no sistema que uso e complilador GCC.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1132
HappyHippyHippo

Vi algures que o scanf dava entrada a virus, que se devia utilizar getchar

são essas afirmações que levam um gajo a dizer : "Jesus Cr1st0 !!!"

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1132
HappyHippyHippo

quem escreveu isso, deve ser a mesma pessoa que colocou a seguinte questão : http://stackoverflow.com/questions/16044660/maybe-i-wrote-a-virus-by-mistake

essa pessoa dá o aspect que nunca aprendeu a usar a função, e agora está numa posição que mandar bitaites desses, tornando-se ele sim, num vírus da educação.

Partilhar esta mensagem


Link 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