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.


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

char nome1[80];
printf("1 - Qual o seu nome?\n");
gets(nome1);
printf("1 - Seu nome e %s\n", nome1);

printf("\n");

char nome2[80];
printf("2 - Qual o seu nome?\n");
scanf("%s", nome2);
printf("2 - Seu nome e %s", nome2);

Saída #1

1 - Qual o seu nome?
Tadeu Pereira
1 - Seu nome e Tadeu Pereira

2 - Qual o seu nome?
Tadeu Pereira
2 - Seu nome e Tadeu

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

char nome3[80];
puts("3 - Qual o seu nome?");
gets(nome3);
// puts("3 - Seu nome e %s", nome3); - Gera erro na compilação
// puts("3 - Seu nome e " + nome3);  - Gera erro na compilação
puts("3 - Seu nome e");
puts(nome3);

Saída #2

3 - Qual o seu nome?
Tadeu Pereira
3 - Seu nome e
Tadeu Pereira

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

char nome4[80];
char seu_nome[100] = "4 - Seu nome e ";
printf("4 - Qual o seu nome?\n");
gets(nome4);
int len = strlen(nome4);
strcat(seu_nome, nome4);
printf("%s e tem %d caracteres\n", seu_nome, len);

Saída #3

4 - Qual o seu nome?
Tadeu Pereira
4 - Seu nome e Tadeu Pereira e tem 13 caracteres

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

char nome5[80];
printf("5 - Qual o seu nome?\n");
gets(nome5);
strcpy(nome5 + 7, nome5 + 8);
printf("5 - Seu nome e %s", nome5);

Saída #4.1

5 - Qual o seu nome?
Tadeu P*ereira
5 - Seu nome e Tadeu Pereira

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

char nome5[80];
printf("5 - Qual o seu nome?\n");
gets(nome5);
strcpy(nome5 + 7, nome5 + 8);
printf("5 - Seu nome e %s", nome5);

printf("\n\n");

char nome6[80];
printf("6 - Qual o seu nome?\n");
gets(nome6);
strcpy(nome5 + 6, nome6);
printf("6 - Seu nome e %s", nome5);

Saída #4.2

5 - Qual o seu nome?
Tadeu P*ereira
5 - Seu nome e Tadeu Pereira

6 - Qual o seu nome?
Lima
6 - Seu nome e Tadeu Lima

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

printf("A = A:\t\t %d\n", strcmp("A", "A"));
printf("A = B:\t\t %d\n", strcmp("A", "B"));
printf("B = A:\t\t %d\n", strcmp("B", "A"));
printf("C = A:\t\t %d\n", strcmp("C", "A"));

printf("\n");

printf("casa = casa:\t %d\n", strcmp("casa", "casa"));
printf("casa = casas:\t %d\n", strcmp("casa", "casas"));
printf("casas = casa:\t %d\n", strcmp("casas", "casa"));

printf("\n");

printf("Tadeu = Tadeu:\t %d\n", strcmp("Tadeu", "Tadeu"));
printf("Tadeu = Ylane:\t %d\n", strcmp("Tadeu", "Ylane"));
printf("Ylane = Tadeu:\t %d\n", strcmp("Ylane", "Tadeu"));

Saída #5

A = A:           0
A = B:           -1
B = A:           1
C = A:           1

casa = casa:     0
casa = casas:    -1
casas = casa:    1

Tadeu = Tadeu:   0
Tadeu = Ylane:   -1
Ylane = Tadeu:   1

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

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.