STRING no C: Seu nome é…

Introdução

No artigo anterior foi inicializada a apresentação do uso de STRING na linguagem de programação C, que sempre trata a STRING como um vetor do tipo char. Também foi dito que muitas linguagens de programação tratam a STRING como um tipo primitivo (PASCALDELPHI) ou como uma classe (JAVA). Por fim foram apresentados exemplos de criação e inicialização dessa estrutura. Este artigo irá mostrar o uso de funções básicas que podem ser utilizadas com a STRING.

Um passo a frente

Foi dito no artigo anterior que “boa parte dos iniciantes na linguagem de programação C sentem como estivessem sem suas cabeças” quando o assunto é STRING, mas no decorrer do artigo esse problema foi sendo esclarecido, e embora não tenha mostrado como o iniciante faça para voar, mostrou que não precisa perder a cabeça para trabalhar com STRING na linguagem de programação C. Após ler este artigo ainda não será possível aos iniciantes alçar grandes voos, mas a maioria já se sentirá confortável para andar e nadar pelo lago.

com_cabeca

Dúvida #1 – gets ou scanf

Aqui não será discutido qual função é melhor, mas sim qual o impacto dessa escolha quando usada com STRING. Isso será mostrado através de um exemplo bem simples e a análise da sua saída.

Exemplo #1:

Saída #1:

Explicando o código:

Na linha 3 do código foi usada a função gets para o usuário entrar com seu nome. A linha 2 da saída indica que o usuário digitou o nome Tadeu Pereira, e na linha 3 da saída é mostrado a mensagem 1 – Seu nome e Tadeu Pereira.

Já na linha 10 do código foi usada a função scanf para o usuário entrar novamente com o seu nome. A linha 6 da saída indica que o usuário digitou novamente o nome Tadeu Pereira, mas na linha 7 da saída mostra apenas parte do nome, ou seja, a mensagem 2 – Seu nome e Tadeu.

Com esse exemplo simples é possível vê que se for necessário capturar uma STRING que contenha o espaço em branco, deve-se utilizar a função gets. Já a função scanf só captura a STRING digitado pelo usuário até encontrar o espaço em branco.

A função scanf entende um espaço em branco como término da entrada […] Assim somente o primeiro nome foi armazenado. […] A função gets […] é mais conveniente para leitura de textos. O seu propósito é unicamente ler uma cadeia de caracteres do teclado enquanto não for pressionado a tecla [ENTER]. Todos os caracteres são armazenados na STRING e é incluído o caractere NULL no final.” [MIZRAHI]

Dúvida #2 – puts ou printf

A função puts pode ser vista como o complemento da função gets. Essa função é designada para mostrar uma única STRING, e reconhece o caractere NULL (\0) como o fim da STRING. O puts também incluí um caractere nova linha (\n) após o conteúdo da STRING.

A função printf também é utilizada para mostrar informações na tela, mas essa função é mais flexível que o puts, uma vez que ela pode mostrar um ou mais valores ao mesmo tempo. Esses valores podem ser STRINGsSTRING e char, STRING e intSTRING e float, etc.

Exemplo #2:

Saída #2:

Explicando o código:

O exemplo anterior mostra a utilização da função puts. Embora não tenha sido utilizado o caractere de \n na linha 2 do código ele foi incluído automaticamente, como é possível ser visto na linha 1 da saída. O mesmo ocorre com as linhas 6 e 7 do código.

Mas talvez a maior diferença entre a função puts e a função printf esteja na impossibilidade da função puts não permitir concatenar duas STRINGs ou ser utilizada com mais de um argumento como na função printf. Por esse motivo as linhas 4 e 5 do código estão comentadas, caso contrário o código não seria compilado.

Mais funções para STRING

As próximas funções necessitam do arquivo string.h, que deve ser incluído pela diretiva #include.

  • Função strlen: Essa função recebe uma STRING como argumento e retorna o seu tamanho.
  • Função strcat: Essa função recebe duas STRINGs como argumento e concatena a segunda na primeira.
  • Função strcpy: Essa função recebe duas STRINGs como argumento e copia o conteúdo da segunda na primeira.
  • Função strcmp: Essa função recebe duas STRINGs como argumento e retorna um número inteiro.

Os próximos exemplos irão mostrar como essas funções devem ser utilizadas.

Exemplo #3 – strlen e strcat:

Saída #3:

Explicando o código:

Na linha 5 do código a função strlen recebeu a STRING nome4 e retorna o seu tamanho que foi atribuído a variável len. A função strcat foi utilizada na linha 6 do código, ela recebeu como argumento seu_nome e nome4, com isso a função strcat inseriu o conteúdo da STRING nome4 na STRING seu_nome.

O resultado da linha 7 do código pode ser visto na linha 3 da saída. A função printf recebeu três argumentos, onde o primeiro argumento é a expressão de controle contendo os códigos de formatação %s e %d. Esses códigos de formatação indicam como os argumentos seguintes (seu_nome e len) serão mostrados.

Exemplo #4.1 – strcpy:

Saída #4.1:

Explicando o código:

Esse exemplo mostra a função strcpy em ação. O usuário digitou o Tadeu P*ereira, ficando fácil notar que o sobrenome foi escrito erradamente, então na linha 4 do código a função strcpy recebeu no primeiro argumento nome5 + 7 e no segundo nome5 + 8. Por que isso?

Para explicar o porquê, primeiro deve ser relembrado que podemos nos referenciar a uma determinada localização do vetor de duas maneiras, a primeira é através da sua posição real e a segunda através do seu índice, que no caso da linguagem de programação C sempre inicia pelo valor 0 (zero) como mostrado abaixo:

Vetor T a d e u
Posição 1 2 3 4 5
Índice
0 1 2 3 4

Agora o porquê da função strcpy ter alterado o valor da STRING nome5 para Tadeu Pereira. A resposta é bem simples, a função pegou do índice 8 (oito) da STRING até o fim e copiou no índice 7 (sete) da mesma STRING.

Para deixar mais claro, será feita uma alteração no exemplo #4.1 como apresentado no exemplo #4.2.

Exemplo #4.2:

Saída #4.2:

Explicando o código:

A parte altera do código deixou mais claro a utilização da função strcpy, pois a função copiou toda a STRING nom6 para o índice 6 (seis) da STRING nome5.

Exemplo #5 – strcmp:

Saída #5:

Explicando o código:

Observe que na linha 1 do código, os caracteres A e B são passados como argumento da função strcmp estão entre aspa (ou aspas duplas), isso informa ao compilador que as mesmas são STRINGs com apenas um caractere.

A saída do código desse exemplo apresenta os possíveis valores de retorno da função strcmp:

  • 0 (zero): Os valores das duas STRINGs são iguais.
  • -1 (menos um): O valor da primeira STRING é menor que o valor da segunda.
  • 1 (um): O valor da primeira STRING é maior que o valor da segunda.

O que significa uma STRING ter um valor menor que outra nas linguagens de programação? Significa que se forem colocadas em ordem ascendente (ou alfabética) ela virá antes da outra.

Obs.: Nesse exemplo foram usadas STRINGs constates, mas os resultados seriam os mesmos se tive sido executado somente vetores do tipo char, ou com constantes e vetores.

Conclusão

O primeiro artigo sobre STRING na linguagem de programação C apresentou os princípios básicos do uso dessa estrutura, mas limitou-se a sua criação e manipulação do seus valores via código. Nesse artigo foi possível vê como é possível manipular seus valores através dos dados informados pelo usuário, além de conhecer algumas funções importantes para serem usadas com STRING.

Até o próximo artigo.

Bibliografia Citada

MIZRAHI, Victorine Viviane. Treinamento em linguagem C. São Paulo: Pearson Prentice Hall, 2008.

Assuntos relacionados:

STRING no C: Qual o seu nome?

Possui mestrado em Computação Aplicada pela Universidade Estadual do Ceará (2010), especialização em Engenharia de Software pela Faculdade de Juazeiro do Norte (2010), graduação em Automática pelo Centro Federal de Educação Tecnológica do Ceará (2005). Tem experiência na área de Ciência da Computação , com ênfase em Sistemas de Computação, atuando principalmente nos seguintes temas: Desenvolvimento dos programas de computador IndSist, Store, Teacher entre outros. Desenvolvimento dos programas Mobile-Android Agenda Iterativa e Guia Cariris.Disciplinas que ministra ou ministrou no ensino superior: Linguagem de Programação, Paradigma de Programação, Estrutura de Dados, Engenharia de Software, Banco de Dados. Currículo Lattes