Páginas

quinta-feira, julho 29, 2010

Lendo string com espaços na função scanf() - Linguagem C

A função scanf serve para ler a entrada padrão (teclado), podendo ler inteiros, floats, caracteres e strings. Para ler uma string usa-se a seguinte sintaxe:

scanf("%s", variavel);

O problema é que ao ler uma string com mais de uma palavra (com espaços) ela para de ler armazenando apenas a primeira palavra. Um exemplo seria a string "Minha casa", caso usemos a sintaxe acima ele apenas armazenará a palavra "Minha", parando ao encontrar o espaço.
O que podemos fazer para corrigir este erro é forçar o scanf ler a string até encontrar o [enter], para isto devemos inserir o seguinte código:

scanf("%[^\n]s", variavel);

Isto fará o scanf ler até encontrar o enter, ao fazer isto ele jogará o enter para a próxima entrada,  fazendo com que ele pule o próximo scanf. Para isto basta limparmos o buffer logo após a entrada, apagando qualquer "sujeira" deixada pelo teclado:

scanf("%[^\n]s", variavel);
setbuf(stdin, NULL);

Com isto você conseguirá ler normalmente nomes com mais de uma palavra.
Se você tiver mais alguma sugestão de como fazer isto (na linguagem C existem mil formas funcionais de se fazerem as coisas) deixe um comentário explicando.

UPDATE:


Você também pode limitar os caracteres que podem ser lidos, criando assim uma forma também do scanf ler todos os caracteres e o espaço, basta digitar:

scanf("%[a-z A-Z]s");

Desta forma ele também irá ler todas as letras do alfabeto (irá ignorar os números digitados também).

17 comentários:

  1. VALEU MANO, VC É DEMAIS. UMA OUTRA DICA É COLOCAR O COMANDO "fflush(stdin)" Antes do Scanf em Strings que usam espaços, mas acredito que isto possa dar problemas. Suas dicas sao melhores.
    Abração meu querido

    ResponderExcluir
  2. véi, é só declarar a variavel char nomevariavel[50]

    ai vc le assim

    gets(nomevariavel);

    e pronto

    ResponderExcluir
    Respostas
    1. É recomendado evitar o uso da função gets(); em programas de qualquer porte, pois ele não limita até que parte da memória o usuário terá acesso, podendo assim (em casos em que o usuário comete um engano ou simplesmente é mal intencionado), causar corrupção de memória.

      Excluir
  3. Outra forma é esta:
    scanf(" %[^\n]s", texto);

    Coloque um espaço entre o abra aspas e o %. Isso limpa o buffer do teclado.

    ResponderExcluir
    Respostas
    1. Velho, você é o cara!! Muito obrigado!

      Excluir
    2. nuuuuuooooooossaaaa!!! valeu demais da conta

      Excluir
    3. Valeu mano, depois de um tempão tentando, consegui com sua dica! Valeu

      Excluir
  4. muito bom parabens amigo me ajudou muito :D

    ResponderExcluir
  5. Este comentário foi removido pelo autor.

    ResponderExcluir
  6. E para limitar o scanf a ler somente números, ou seja, se digitar uma letra ele não lê.
    Alguém poderia me dizer?
    Grato.

    ResponderExcluir
    Respostas
    1. nesse caso seria o scanf ("%[0-9]s", numero);

      Excluir
  7. E como seria a função printf para imprimir as frase digitadas e armazenadas em um vetor?

    ResponderExcluir
    Respostas
    1. seria printf("%s", nome_do_vetor); isso imprime uma string
      ou se vc qiser imprimir apenas algumas partes vc usa um for tipo:
      for(int x=0; numero de posições do vetor que qer imprimir; x++)
      printf("%c", vetor[x]);
      tambem usando for vc pode imprimir td usando:
      for(int x=0; x<strlen(nome_do_vetor); x++) //porem vc precisa acrescentar a biblioteca string.h pra n ocorrer um erro
      printf("%c", vetor[x]);
      ou de forma mais direta vc pode imprimir dizendo as posições que deseja qe sejam impressas usando:
      printf("%c%c%c%c%c...etc", vetor[0],vetor[1],vetor[2],vetor[3],vetor[4]...etc);

      Excluir
  8. Vlw !!

    Me ajudou com o problema de "lixo" do teclado no scanf()



    ResponderExcluir

Frase

“Inovação distingue um líder de um seguidor.”
(Steve Jobs)