Cadeia de Caracteres: Funções de Entrada e Saída

Este post faz parte da série Cadeia de Caracteres. Leia também os outros posts da série:

Neste artigo darei continuidade ao tema "Cadeia de Caracteres". Para que vocês consigam acompanhar este artigo, torna-se leitura obrigatória a série de artigos do Fernando Delunga Garcia sobre Ponteiros. Somente depois de ler todos os artigos dessa série maravilhosa, aí sim você estará preparado para continuar com a minha série de Estruturas de Dados. Fechado?

 

No artigo passado eu introduzi o conceito de Cadeia de Caracteres, mostrei como definir, declarar, inicializar e ler caracteres do teclado usando Scanf(). No artigo de hoje exploraremos algumas funções de Entrada e Saída, de forma bem simples e objetiva, que são utilizadas para manipulação de cadeia de caracteres.

 

Função gets

 

É uma função da biblioteca de entrada e saída que permite ler todos os caracteres digitados, inclusive espaços em branco, até que ocorra um fim de arquivo (EOF: End of File), ou até que seja digitado o caractere de fim de linha (ENTER). Note que esta função resolve o problema de scanf, já que a leitura e armazenamento dos dados do teclado continua até que o usuário aperte a tecla Enter, a qual não é armazenada.

 

Porém, é preciso tomar muito cuidado com o uso dessa função, já que um estouro na quantidade de posições que foi especificada no vetor de caracteres pode ocorrer, tornando a função insegura. Esse estouro acontece porque a função gets não verifica se a cadeia de caracteres é capaz de receber os caracteres digitados, fazendo com que valores sejam armazenados em áreas indevidas da memória. Portanto, muito cuidado ao utilizar esta função em seus programas.

 

O protótipo da função gets é:

 

A função retorna:

  • um ponteiro para a cadeia "s";
  • um ponteiro nulo se um erro de leitura ocorrer;
  • um ponteiro nulo se ocorrer um fim de arquivo;
  • um ponteiro nulo se nenhum caractere tiver sido digitado.

 

Exemplo:

 

Saída no console da função gets - Funções de Entrada e Saída
Figura 1: Saída no console da função gets.

 

O Vetor foi definido com apenas 10 posições e, mesmo assim, a função gets guardou todos os caracteres digitados, mesmo que tenham ultrapassado as 10 posições determinadas. Este exemplo ilustra que a função gets resolve o problema da função scanf, mas gera outro problema ainda mais grave. De acordo com Francisco A. C. Pinheiro, autor do livro Elementos de Programação em C, a função gets foi removida da versão 2011 do padrão da linguagem. Para nossa sorte, existe uma função que consegue fazer a leitura adequada de uma cadeia de caracteres: fgets.

 

Função fgets

 

É uma função da biblioteca padrão de entrada e saída (stdio.h). Funções desta biblioteca manipulam dados de caractere e string. Protótipo da função:

 

  • s é a cadeia de caracteres;
  • n é um número inteiro que limita a quantidade de caracteres;
  • arquivo é uma variável do tipo File, na verdade uma variável usada para fluxo de dados.

 

A função fgets (Linha 6) permite ler caracteres até encontrar o fim do arquivo, ou até encontrar o caractere de fim de linha, ou ainda até n-1 caracteres. Ao digitar ENTER, ao término da digitação da string, esse caractere é anexado na cadeia de caracteres s, da mesma forma que o terminador. A função retorna:

  • um ponteiro para a String s;
  • um ponteiro nulo em caso de erro de leitura;
  • um ponteiro nulo em caso de fim de arquivo;
  • um ponteiro nulo se nenhum caractere tiver sido digitado.

 

Exemplo:

 

Na função fgets um array de caracteres é definido, com o identificador NOME, o tamanho em um número inteiro (15), e stdin - lembre-se, a função fgets exige três parâmetros - sendo STDIN o fluxo de entrada padrão normalmente usado para leitura de caracteres via teclado.

 

Saída no console para fgets.
Figura 2 : Saída no console para fgets.

 

O vetor declarado tem 15 posições e somente essas 15 posições são preenchidas. Na saída, observa-se que o nome digitado é maior que as 15 posições, e, portanto, o restante do nome é desprezado.

 

Função sscanf

 

Esta função é equivalente à scanf, porém a entrada é lida a partir de um array ao invés do teclado, retornando o número de itens lidos com sucesso, ou então, EOF se haver erro. Protótipo da função:

 

No exemplo abaixo, um array de caracteres é declarado e inicializado com valores numéricos. Em seguida duas variáveis são criadas, uma do tipo inteiro (x) e outra do tipo real (y), isso porque será atribuído para cada uma delas um desses valores do array. Note que sscanf é usado para ler o array: s é o array, %d %lf são os tipos inteiro e float, e os terceiro e quatro parâmetros são as variáveis x e y usadas para leitura. Dessa forma, o vetor é lido, e conforme ele é lido os valores são armazenados em outras variáveis já determinadas, e somente depois é impresso na tela. Essa função pode ser muito útil para quando você trabalhar com arquivos ou outros tipos de fluxos de dados.

 

 

Saída no console da função sscanf
Figura 3: Saída no console da função sscanf

 

Função putchar

 

Esta função imprime o caractere armazenado em um inteiro. Protótipo da função:

 

O exemplo abaixo solicita ao usuário que digite um número e em seguida imprime na tela o caractere correspondente. 

 

Saída no console do exemplo putchar
Figura 4: Saída no console do exemplo putchar

 

Função puts

 

Esta função imprime a string s seguida por um caractere de nova linha, isto é, imprime e pula linha. Retorna um inteiro diferente de zero se bem sucedida ou EOF se houver algum erro. Protótipo da função:

 

O exemplo abaixo solicita ao usuário que digite um nome, o qual é obtido pela função gets. Em seguida imprime o conteúdo usando puts. A linha 12 mostra como imprimir uma parte da String. Neste exemplo, puts começará a imprimir a partir do caractere 4, por isso o nome aparecerá cortado no console.

 

 

Saída no console de puts
Figura 5: Saída no console de puts

 

Função sprintf

 

Protótipo da função:

 

Esta função é equivalente à printf, a diferença é que a saída (formatada) é armazenada no array ao invés de ser impresso diretamente na tela. Ela retorna o número de caracteres escritos em s, e se houver erro retorna EOF. Exemplo:

 

Saída no console do exemplo Sprint
Figura 6: Saída no console do exemplo Sprint

 

Função getchar

 

Esta função recebe um caractere e retorna o seu valor inteiro. Protótipo da função:

 

Getchar também pode ser utilizado ao fim do programa (ou em alguma parte de bloco de código), de forma que, enquanto o usuário não digitar algo no teclado, o console não será fechado. Exemplo:

 

Saída no console do exemplo de getchar
Figura 7: Saída no console do exemplo de getchar

 

Função strlen

 

Esta função calcula o tamanho da cadeia de caracteres e retorna o tamanho, isto é, conta quantos caracteres aquela cadeia possui. Isso ajuda no momento de realizar alguma operação que se faz necessário saber onde, ou quando, a cadeia de caracteres termina.  Portanto, a função determina o comprimento da String, retornando o número de caracteres anteriores ao terminador. Protótipo da função:

 

Neste exemplo são declaradas duas strings (linha 7), as quais são lidas, armazenadas e, em seguida, duas variáveis do tipo inteiro armazenam o tamanho dessas strings, o qual é calculado por strlen (linhas 13 e 14). Note que só foi preciso passar como parâmetro para a função, a variável do tipo cadeia de caracteres, para que o cálculo fosse feito pela própria função.

 

Saída no console do exemplo 1.
Figura 8: Saída no console do exemplo 1.

 

Exemplo 2:

 

Saída no console do exemplo 2.
Figura 9: Saída no console do exemplo 2.

 

Esse segundo exemplo mostra outra forma de usar strlen. Aqui uma função chamada "conta letra" é codificada para contar quantos caracteres iguais se repetem na cadeia. Dessa forma, a função percorrerá todas as posições do vetor de caracteres, procurando pelo caractere fornecido, incrementando a quantidade quando encontrar. No termo "game of thrones" foram encontradas duas ocorrências da letra "e". Strlen é usado aqui neste exemplo para delimitar o tamanho da cadeia de caracteres dentro do For.

 

 

Conclusão

 

Neste artigo apresentei duas funções para você utilizar no momento de obter dados do teclado para cadeias de caracteres e, também, como usar a função strlen. Fiquem espertos pois, agora que já sabemos definir, declarar, inicializar e preencher uma cadeia de caracteres, passaremos para outras funções mais complexas. Até. Ah, e não se esqueçam, deixem as dúvidas aí nos comentários, ok!

Outros artigos da série

<< Cadeia de Caracteres - Introdução
Este post faz da série Cadeia de Caracteres. Leia também os outros posts da série:

Bacharel em Engenharia de Computação. Mestre em Ciência da Computação. Cantora, Professora Universitária, Geek, Nerd, Otaku e Gamer. Apaixonada por Michael Jackson, Macross, Mulher Maravilha, Superman, Cervejas Artesanais/Especiais e Voleyball. Informações adicionais você encontra em: http://lattes.cnpq.br/8559022477811603.

Deixe um comentário

Seja o Primeiro a Comentar!

Notificar
avatar
wpDiscuz