Strings

Teoria Completa

Introdução

Fala aí, aqui é o Guga do Responde Aí! Tudo bem com você?

Você já parou para pensar se ao invés de armazenarmos apenas um caractere tivéssemos que armazenar uma palavra inteira, uma frase ou quem sabe um texto?

Nesse tópico nós vamos ver como os vetores são tão importantes no armazenamento desse tipo de dado.

Strings

Nós já criamos um vetor de caracteres antes, mas nunca mencionamos que um vetor de caracteres organizados pode se tornar uma palavra!

Dá uma olhadinha na imagem a seguir:

Isso nada mais é do que uma string, ou seja, uma forma textual de armazenar letras, números, pontos, espaços em branco etc. O objetivo é simples, formar palavras, frases, textos e tudo aquilo que de alguma forma precisamos manipular inúmeros caracteres para fazer sentido.

Diferente de outras linguagens, a linguagem de programação C não possui nenhum tipo string padrão, sendo a única forma de fazer esse armazenamento através de um vetor de caracteres.

Por sorte, quando nos referimos a strings formadas por vetores do tipo char existem uma série de macetes que podem ser aplicados!

Leitura de strings

Suponha que nós tenhamos que realizar a leitura de uma string, diferente da maneira com que nós utilizávamos a função scanf(), a leitura de uma string é feita da seguinte forma:

Onde no primeiro parâmetro estamos dizendo para a função de leitura ler todos os tipos de caracteres (incluindo espaços em branco) até encontrar um \n, em outras palavras, tudo o que for digitado antes do usuário aperta enter será armazenado no vetor string.

Vale lembrar que o vetor string possui tamanho 50, ou seja, se aquilo que for digitado extrapolar esse tamanho dizemos que ocorreu um overflow, isso significa que a memória que tinha disponível para aquela ação “estourou”.

E o que acontece quando aquilo que for digitado não suprir os 50 caracteres disponíveis para utilização?

Exemplo ilustrado pela figura a seguir:

A função de leitura nos protege do lixo de memória (que ocorre a partir do índice 4) colocando um terminador de string também conhecido como o caractere especial \0. Isso significa que tudo aquilo que está armazenado após o terminador deve ser ignorado, pois não faz parte efetivamente da string e poderá causar mal funcionamento caso considerado.

De maneira geral, a leitura de uma string é feita da seguinte forma:

Impressão de strings

Por sorte, a impressão de uma string é muito menos complexa que sua leitura, pois a única diferença entre a conhecida utilização da função printf() é o especificador de tipo string conhecido como %s.

De maneira geral, para imprimirmos uma string basta codificarmos o seguinte comando:

E tudo aquilo que está antes do terminador \0 será impresso.

Isso fará com que tudo aquilo que esteja antes do terminado \0 seja impresso, ignorando os posteriores lixos de memória.

Biblioteca string.h

A linguagem C possui uma biblioteca exclusiva para a manipulação de strings, então caso nós tenhamos que utilizar alguma função mais cabulosa, é muito provável que a documentação oficial dessa biblioteca, chamada string.h, tenha informações cruciais para a aplicação dessas funções.

Isso sim é um dica de parceiro!

Agora que já entendemos o que são e como utilizar strings na linguagem C está na hora de resolvermos alguns exercícios de fixação, você não acha?

Te espero na página aqui do ladinho!

Expandir

Exercício Resolvido #1

Faculdades Metropolitanas Unidas – FMU, Exercícios sobre string, Eduardo Silvestri, 2007, pp. 01 – Adaptação do exercício 01.

Faça um programa que leia uma string e armazene-a invertida em outra string. Utilize uma estrutura de repetição para varrer e imprimir a nova string.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

A primeira coisa que nós iremos fazer é definir o escopo do programa.

Passo 2

Com o escopo definido, nós iremos declarar as variáveis e vetores que serão úteis para armazenar os dados do nosso programa.

Informações sobre as variáveis e vetores:

  • string é um vetor de caracteres que será responsável por armazenar uma cadeia de caracteres;
  • invertida é um vetor de caracteres que será responsável por armazenar o conteúdo presente em string em sua forma invertida;
  • i e j são variáveis contadoras do programa.

Passo 3

Com as variáveis declaradas e inicializadas, nós podemos agora requisitar os dados de entrada do programa ao usuário.

Esse dado nada mais é do que uma cadeia de caracteres (string).

Passo 4

Antes de começarmos a inverter a cadeira de caracteres, nós precisamos primeiro identificar o índice do terminador nulo no vetor string.

Para isso, podemos utilizar a estrutura de repetição while que incrementará a variável contadora i enquanto o dado armazenado na posição de índice i do vetor string for diferente do terminador nulo.

Ao término desse processo, saberemos exatamente em que índice do vetor string se encontra o terminador nulo. Dessa forma, podemos atribuir ao vetor invertida nesse mesmo índice outro terminador nulo, uma vez que invertida armazenará o mesmo conteúdo que string e ambas devem ter suas cadeias de caracteres terminadas na mesma posição.

Passo 5

Com o vetor invertida pronto para receber uma cadeia de caracteres, nós podemos utilizar um laço de repetição for para atribuirmos os caracteres presentes no vetor string em sua ordem inversa.

A lógica é simples, nós sabemos que nesse momento do programa a variável contadora i está armazenando o índice do terminador nulo do vetor string. Com isso, podemos reiniciá-la com o seu valor atual menos 1 (último caractere do vetor string) juntamente com outra variável contadora j inicializada com o valor 0. A condição de execução desse laço é i maior ou igual a 0. Por fim, as regras de atualização das variáveis contadoras a cada loop são: i é decrementada em uma unidade e j é incrementada em uma unidade.

Com isso, o último caractere de string será atribuído a primeira posição de invertida, o penúltimo a segunda posição e assim por diante.

Passo 6

Ao término do laço de repetição for teremos a cadeia de caracteres presente em string armazenada em sua forma inversa no vetor invertida, bastando apenas realizarmos a sua impressão.

Essa impressão será seguida de uma quebra de linha.

Resposta

Exercício Resolvido #2

Universidade de São Paulo – USP, Laboratório de Introdução à Ciência da Computação I – Vetores e strings, 2009, pp. 02 – Exercício 04.

Faça um programa que leia duas strings. Após isso, o programa deve concatenar as informações lidas e mostrar o resultado para o usuário.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Vamos começar definindo o escopo do nosso programa.

Passo 2

Com o escopo definido, podemos agora declarar as variáveis e os vetores que farão parte do nosso programa.

Informações sobre as variáveis e os vetores:

  • stringA e stringB são vetores de caracteres que serão responsáveis por armazenar as duas cadeias de caracteres inseridas pelo usuário, respectivamente;
  • stringC é um vetor de caracteres responsável por armazenar a concatenação de stringA e stringB;
  • i e j são variáveis contadoras.

Passo 3

Com as variáveis declaradas e devidamente inicializadas, nós podemos requisitar ao usuário os dois dados de entrada do programa.

Esses dados são respectivamente: a primeira e segunda cadeias de caracteres.

Passo 4

Basicamente, nós podemos utilizar uma estrutura de repetição while para preencher o vetor stringC com o conteúdo dos vetores stringA e stringB.

Começando pela primeira string, tudo o que nós temos que fazer é definir a condição do laço while como: enquanto o conteúdo do vetor stringA na posição i for diferente do terminador nulo. Com essa condição, basta adicionarmos a instrução em que a stringC na posição i recebe o conteúdo da stringA nessa mesma posição. Ah! Não podemos esquecer de incrementar i em uma unidade.

Com isso, estamos repassando todo o conteúdo da stringA para a stringC até chegarmos no terminado nulo (que não será atribuído).

Passo 5

O mesmo do passo anterior deve ocorrer com a stringB, ou seja, temos que passar o seu conteúdo para a stringC.

Porém, dessa vez nós temos que percorrer o vetor stringB com uma nova variável contadora j (inicializada em 0) e atribuirmos os caracteres ao vetor stringC na mesma posição que parou no laço anterior.

Dessa forma, pegaremos o conteúdo de stringB desde o começa e atribuiremos na posição seguinte em que o conteúdo de stringA foi armazenado em stringC (isso é a concatenação).

Como a lógica é a mesma do laço anterior, quando o conteúdo de stringB na posição j for igual ao terminado nulo, quer dizer que as duas cadeias de caracteres já estão concatenadas em stringC e basta adicionarmos o terminador nulo desse vetor (linha 20).

Passo 6

Por fim, basta imprimirmos o conteúdo de stringC que obteremos os conteúdos de stringA e stringB concatenados.

Essa impressão será seguida de uma quebra de linha.

Resposta

Exercício Resolvido #3

Faculdades Metropolitanas Unidas – FMU, Exercícios sobre string, Eduardo Silvestri, 2007, pp. 01 – Adaptação do exercício 07.

Faça um programa em C que troque todas as letras minúsculas de uma string recebida como entrada por letras maiúsculas.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Vamos começar definindo o escopo do nosso programa.

Passo 2

Com o escopo definido, nós agora podemos declarar a variável e o vetor que serão úteis em nosso programa.

Informações sobre as declarações realizadas:

  • i é uma variável contadora;
  • string é um vetor de caracteres que será responsável por armazenar uma cadeia de caracteres inserida pelo usuário.

Passo 3

Em seguida, nós devemos requisitar o dado de entrada do programa ao usuário.

Esse dado nada mais é do que uma cadeia de caracteres que será armazenada em string.

Passo 4

Para efetivamente realizarmos a conversão, nós podemos utilizar uma estrutura de repetição while para percorrer o veto em busca de letras minúsculas.

Para isso utilizaremos a seguinte condição de execução: enquanto o conteúdo de string na posição i for diferente do terminador nulo. Tal condição é seguida das instruções condicionais que verificam se o caractere presente nessa posição é minúsculo (deve estar no intervalo entre 97 e 122, incluindo os extremos, da tabela ASCII). Caso seja, uma subtração desse caractere por 32 é realizada (as letras maiúsculas vêm antes das minúsculas na tabela ASCII), o que faz com que ele assuma sua forma maiúscula.

Vale ressaltar que enquanto a condição for verdadeira e os loops forem executados, a variável i estará sendo incrementada em uma unidade por loop.

Passo 5

Ao término do laço de repetição, todas as letras de string são maiúsculas. Basta agora apenas imprimirmos esse vetor:

Essa impressão será seguida de uma quebra de linha.

Resposta

Exercício Resolvido #4

Universidade de São Paulo – USP, Laboratório de Introdução à Ciência da Computação I – Vetores e strings, 2009, pp. 02 – Exercício 06.

Implemente um programa em C que receba um nome completo e apresente apenas o último nome e o primeiro nome na seguinte forma: “1º nome, último nome”. Considere que todas as entradas de nomes completos serão compostas apenas de 3 nomes, por exemplo: José Almeida Barros.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

A primeira coisa que devemos fazer para desenvolver esse programa, é definir seu o escopo.

Passo 2

Com o escopo definido, podemos declarar os vetores necessários para o desenvolvimento desse programa.

Informações sobre os vetores:

  • primeiroNome é um vetor de caracteres que será responsável por armazenar o primeiro nome do nome completo inserido pelo usuário;
  • intermediario é um vetor de caracteres que será responsável por armazenar o nome do meio (que será ignorado);
  • ultimoNome é um vetor de caracteres que será responsável por armazenar o último nome do nome completo inserido pelo usuário.

Passo 3

Basicamente, nós utilizaremos expressões regulares na função scanf para definir apenas aquilo que desejamos ler.

Devemos estabelecer duas leituras até o primeiro espaço em branco digitado, ignorando esses espaços logo em seguida para que eles não afetem as leituras posteriores. Dessa forma, teremos o primeiro nome e o nome intermediário (que sempre são seguidos de espaço em branco, por isso a expressão regular).

Porém, a leitura do último nome deve ser realizada usando como parâmetro de parada na expressão regular a quebra de linha. Isso fará com que a tecla enter de confirmação seja o gatilho para a obtenção do último nome.

Passo 4

Após a leitura, basta imprimirmos os nomes no formato exigido pelo enunciado:

Resposta

Exercício Resolvido #5

Faculdades Metropolitanas Unidas – FMU, Exercícios sobre string, Eduardo Silvestri, 2007, pp. 01 – Adaptação do exercício 04.

Faça um programa que leia uma string do teclado e diga se ela é palíndromo. Uma string é palíndromo quando pode ser lida tanto de trás pra frente quanto de frente para trás e possui exatamente a mesma sequência de caracteres. Considere no desenvolvimento apenas palavras palíndromos.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Vamos começar o nosso desenvolvimento definindo o escopo do programa.

Passo 2

Com o escopo definido, está na hora de declararmos e inicializarmos as variáveis e o vetor que serão essenciais para o programa.

Informações sobre as declarações:

  • i e j são variáveis contadoras;
  • flag variável booleana representativa que marcará se a palavra é ou não um palíndromo, sendo 0 para verdadeiro e 1 para falso;
  • string é um vetor de caracteres que será responsável por armazenar uma cadeia de caracteres inseridas pelo usuário.

Passo 3

Nesse momento, podemos requisitar o dado de entrada do programa ao usuário.

Esse dado nada mais é do que a cadeia de caracteres que será verificada como sendo ou não um palíndromo.

Passo 4

Antes de iniciar a verificação, nós precisamos encontrar o último caractere do vetor string.

Para isso basta utilizarmos um laço de repetição while com a condição: enquanto o conteúdo do vetor string na posição j for diferente do terminador nulo. Tal condição deve ser seguida do incremento da variável j a cada loop, isso fará que ao encerramento do laço o valor armazenado por j seja exatamente uma unidade a mais que a posição onde se encontra o último caractere de string.

Passo 5

Sendo assim, basta utilizarmos a estrutura de repetição for para verificarmos se string é uma palavra palíndromo ou não.

Essa verificação só é possível, pois estabelecemos na inicialização as duas variáveis contadoras dos dois diferentes extremos de string. Além disso, a regra de atualização delas são opostas, enquanto i é incrementada j é decrementada, ambas em 1 unidade.

Tendo em vista o comando condicional nas instruções da estrutura, nós podemos concluir que esse laço de repetição irá verificar a igualdade do primeiro termo de string com o último, do segundo com o penúltimo e assim por diante. Caso alguma verificação de igualdade seja falha, a variável flag é atribuída com o valor 1.

Passo 6

Por fim, é a variável flag que será verificada. Se ela possuir o valor 1, quer dizer que uma das posições extremas correspondentes não são iguais e a palavra não é um palíndromo. No entanto, se flag possuir o valor 0, a palavra se trata de um palíndromo.

Em ambos os casos, uma impressão seguida de uma quebra de linha será feita.

Resposta

Exercício Resolvido #6

Faculdades Metropolitanas Unidas – FMU, Exercícios sobre string, Eduardo Silvestri, 2007, pp. 01 – Exercício 05.

Faça um programa que conte quantas letras maiúsculas existem numa string.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

A primeira coisa que nós vamos fazer é definir o escopo do nosso programa.

Passo 2

Com o escopo definido, nós podemos declarar e inicializar algumas variáveis e vetores que serão úteis.

Informações:

  • i é uma variável contadora;
  • q t d M a i u s c u l a s é uma variável responsável por armazenar a quantidade de letras maiúsculas da string inserida pelo usuário do programa;
  • s t r i n g é um vetor de caracteres com 100 posições.

Passo 3

Com as variáveis já declaradas e devidamente inicializadas, podemos requisitar a entrada da string ao usuário do programa.