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 (PASCAL e DELPHI) 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 STRINGs, STRING e char, STRING e int, STRING 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
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.