Olá, seja bem-vindo de volta. Outra palestra emocionante. Nesta aula, vamos
falar mais sobre strings e funções
de string, principalmente a capacidade de procurar tokenizar e analisar strings.
Então, vamos discutir mais algumas funções de string. Procurando uma string.
Procurando uma string.
Todas essas funções estarão no cabeçalho da string.
Existem algumas funções de pesquisa de string de uso específico, onde
você pode encontrar um caractere específico ou uma substring.
Os nomes dessas funções são strchr
e strstr.
Encontrar um único caractere ou substring dentro de uma string.
Forneceremos alguns exemplos disso.
Existem também alguns recursos para tokenizar uma string.
Você pode dizer o que é tokenização de uma string. Primeiro, você deve definir o que é um token.
Um token é uma sequência de caracteres dentro de uma string delimitada por um delimitador.
Um delimitador é algo que está na string que você percebe
e que tem um significado especial.
Portanto, um token seria se você tivesse uma string completa, este
é Jason e estava separado por espaços.
Um token pode ser este, outro pode ser, outro pode ser Jason.
É uma maneira de pegar uma string inteira e quebrá-la em
certos limites com base em um delimitador.
E você quer ter certeza de que seu delimitador
não é algo válido na string real. Então você também usa
delimitadores quando lê arquivos, mesmo tipo de conceito.
Quando você divide uma frase em palavras, isso é chamado de tokenização. Vamos usar esta função
chamada strtok.
Também quero falar sobre a análise de algumas cordas. Há uma
tonelada deles, muitos diferentes para verificar se
os caracteres são minúsculos ou maiúsculos
ou alfanuméricos ou dígitos.
Isso é feito principalmente em caracteres, mas em strings laterais e
você também pode aplicá-los a strings inteiras.
Agora estamos entrando em mais alguns detalhes sobre strings.
E para entender algumas dessas funções, temos que falar um pouco sobre ponteiros.
Os ponteiros são um grande conceito em c.
Teremos uma seção inteira dedicada a dicas.
Provavelmente, o próximo ou o seguinte.
E é muita discussão. É provavelmente o tópico mais confuso da linguagem.
Não quero falar sobre isso em detalhes agora porque não é relevante.
Eu só quero tocar nisso, apenas dar uma pequena amostra do que é um ponteiro, para
que você possa entender algumas dessas funções que vamos usar.
Esse é o único propósito disso. Portanto, se você não entender totalmente as
dicas neste momento, após estes dois slides, não se preocupe.
Portanto, o conceito de ponteiro, mais uma vez, vamos discutir em detalhes mais tarde.
Mas, para entender algumas dessas funções de string, quero dar uma olhada rápida.
C fornece um tipo notável de variável útil, é chamado de ponteiro.
Eu estive falando sobre isso. Tem a ver com memória e alocação de memória.
Algumas linguagens, se você já programou antes e
não é totalmente novo na programação, algumas linguagens gerenciarão a memória automaticamente para você.
Eles alocarão memória para você e a excluirão, uma linguagem como o java faz isso.
É chamado de coletor de lixo. Uma linguagem como c não faz isso.
Portanto, sempre que você criar memória para
usar ponteiros, deverá excluí-la.
Mas o que é um ponteiro, é muito
útil e o que é uma variável que armazena um endereço.
Um endereço, lembre-se, é algo na memória.
Geralmente é hexadecimal.
O valor do endereço está em outro local da memória.
O ponteiro apenas aponta para um endereço cujo endereço contém um valor.
E nós usamos endereços no passado com a função scanf.
Lembre-se de que o símbolo do E comercial que usamos é o endereço do operador.
A função Scanf como seu segundo parâmetro teria
que levar em uma variável que você deseja armazenar
os dados, essa variável tem que ser um ponteiro.
E então a função scanf esperava um ponteiro.
Para criar um inteiro sozinho, ele não é um ponteiro, mas se
você obtiver o endereço dele, ele agora se torna um ponteiro.
Portanto, estamos usando o E comercial para obter o endereço de um tipo de dados primitivo.
Então você está um pouco familiarizado com o conceito de endereço.
Lembre-se, a partir de agora, com ponteiros, você
cria um número int e isso não é
um ponteiro e é igual a 25.
Mas se você obtiver o e comercial dele, que é o endereço dele, poderá atribuí-lo a um ponteiro.
Um Pointer tem sintaxe especial em c, o asterisco representa um ponteiro.
Portanto, declaramos um número de variável com o valor 25 e, em
seguida, declaramos um ponteiro usando o asterisco denominado pNumber,
que contém o endereço de number.
E novamente, o asterisco é usado para declarar o ponteiro, é assim que você sabe
que é um tipo de dado ponteiro.
Para obter o valor da variável p número porque
p número é o quê? É um ponteiro que aponta para um endereço na memória.
Se você apenas tentar olhar para o valor do número p, ele lhe dará o endereço.
Se você deseja obter o valor para o qual o endereço está apontando, é necessário retirá-lo da referência.
Portanto, há uma sintaxe
especial que c usa, é chamada de asterisco e o nome da variável, é assim
que você pode acessar o local da memória que contém o valor.
Portanto, se você quiser atribuir dados a esse local da memória, terá que dizer asterisco p número.
Novamente, o efeito é que ele acessa os dados armazenados no endereço especificado pelo ponteiro.
Portanto, fica muito confuso quando falamos sobre ponteiros porque você não está acostumado com esse conceito.
Você acha que uma variável tem um valor, é isso. Mas uma variável pode ter um endereço e
o endereço pode ter um valor.
Este slide tenta ilustrar o que acabei de mencionar.
Eu encontrei isso em um livro que li.
É um slide que mostra o conceito de um ponteiro na memória e
como as coisas funcionam com os endereços.
Então, estou reiterando o que acabei de mencionar.
Mas o valor do número do e comercial é o endereço onde o número está localizado.
Portanto, se você tem duas variáveis, número ep
número, p número é um ponteiro, número é um int,
você também, a propósito, deve especificar o tipo do ponteiro.
Mesmo que o ponteiro seja um
endereço, você ainda especifica o tipo ou para onde o endereço está apontando.
Portanto, int star p number será igual ao endereço do number.
O número está na memória e aponta para
um endereço de mil, por exemplo, e tem um valor de 25.
O número P tem um endereço 105
para esse número p real, mas
o valor desse endereço é 1000 endereço.
Para obter o valor do número p, você teria que desreferenciar 1000, o que
resultaria em 25.
A razão pela qual menciono tudo isso sobre
ponteiros é que muitas funções de string retornarão ponteiros.
Não vai realmente importar muito.
É importante apenas quando você deseja entender como está inserindo um determinado caractere em um array.
Mas eu queria mencioná-los brevemente.
Tudo bem se o conceito não for compreendido agora, porque vamos abordá-lo com
muitos detalhes em uma seção posterior.
Mas entenda que as funções de string agora que vamos usar vão retornar ponteiros
e então você vai talvez usar esse return para fazer algo útil.
No passado, quando usamos as cópias str e as comparações str,
passávamos ponteiros, mas ele nunca retornava ponteiros, nunca tivemos que usar esse ponteiro.
Agora que precisamos usar o ponteiro, quero apenas dar uma pequena descrição do que isso significa.
O Pointer vai apenas apontar para um endereço.
E então você pode usar esse endereço para fazer a análise ou o que for necessário.
Então, esperançosamente, isso não o sobrecarregou. Novamente, não se preocupe se você não entender completamente.
Veremos agora alguns exemplos
de análise, tokenização e pesquisa de strings.
Para pesquisar uma string, conforme mencionamos, você usará strchr ou strstr.
O strchr pesquisa uma determinada string para um único caractere.
O primeiro argumento da função é a string a ser pesquisada,
que será o endereço de um array de caracteres.
O segundo argumento é o personagem que você está procurando.
Forneceremos um exemplo em um segundo. Portanto, a função irá pesquisar
a string começando no início e retornar
um ponteiro para a primeira posição na string onde o caractere foi encontrado.
É por isso que o ponteiro é importante agora, porque
não estamos retornando um valor inteiro, estamos retornando um ponteiro para
um caractere dentro de
uma string e esse endereço representa o índice de uma matriz, essencialmente.
Portanto, o endereço desta posição na memória, é um tipo de caractere estrela e é
descrito como um ponteiro para
um char, que na verdade é apenas um único caractere na memória.
Para armazenar o valor que é retornado, você deve criar uma variável que possa armazenar o endereço de um
caractere, portanto, você deve criar um ponteiro.
Se o caractere for encontrado agora, a função retorna um valor especial, que é nulo.
Nulo significa que o ponteiro não aponta para nada.
Usamos null quando falamos sobre ponteiros, e null está
apenas dizendo que não encontrou nada. Portanto, não está apontando para nada.
Quando ele aponta para algo, ele aponta para o endereço de onde você encontrou aquele caractere e
então você pode começar a analisar a partir daí.
Porque lembre-se das aulas anteriores,
quando você cria uma matriz de caracteres na
memória, você apenas tem cada caractere representado como um byte.
E se você estiver analisando
uma string e quiser ver onde um determinado caractere começa nessa string, você
retorna aquele byte e então pode começar a procurar a partir daí.
Então, str char, como você usa isso.
Você diz que cria uma string de caracteres e nós
a inicializamos aqui com uma rápida raposa marrom.
Em seguida, criamos um único caractere e o inicializamos com q.
Então criamos um ponteiro porque temos que criar um ponteiro porque é o que é retornado de str char,
é isso que nos permite ver onde naquela string encontramos um caractere.
Vamos inicializar nosso ponteiro para nulo. Porque agora não vai apontar para nada.
Então vamos chamar str char, vamos passar nossa string que é a raposa marrom rápida, e
vamos passar nosso único caractere que é q.
O que vai acontecer é olhar dentro da rápida raposa marrom.
E na primeira vez que encontrar um q, ele retornará o endereço desse q.
Então, p got char
vai realmente apontar para o quarto índice de str.
Porque t é sub-zero, h é sub-um, e é sub-dois, o
espaço é sub-três, q é sub-quatro.
Então p got char vai apontar para q na rápida raposa marrom.
E então você pode ver exatamente onde o caractere começa nessa string.
Portanto, o primeiro argumento para str char é o endereço do primeiro local a ser pesquisado, que
é a string de pesquisa.
O segundo argumento é o personagem que se busca, o personagem que você quer procurar,
um único personagem.
Ele espera que o segundo argumento seja do tipo int.
Então, tecnicamente str char, o segundo argumento abrange.
Mas o compilador c converterá automaticamente o gráfico em um int.
Ele obterá o valor ASCII, essencialmente.
Então, você pode definir q único caractere em
vez de um único caractere, você pode defini-lo como um int.
Isso é apenas mais um detalhe técnico que eu queria que você soubesse.
Mas p got char vai apontar para o valor quick brown
fox porque vai começar em qe então vai para o terminador nulo se você tentar imprimir.
Então, na verdade, vai ser uma raposa marrom rápida quando você executar este exemplo.
É assim que você pode pesquisar um único caractere em uma string inteira.
Use str char, use o ponteiro e exiba o ponteiro.
E como você exibe esse ponteiro? Da mesma forma que você exibe outros caracteres, use printf, por cento s.
Portanto, este é um bom mecanismo para pesquisar caracteres em uma string inteira.
Se você quiser pesquisar uma string dentro de uma string, que seria
uma substring, use strstr.
Esta é provavelmente a mais útil de todas as funções de pesquisa.
Ele pesquisa uma string para a ocorrência de uma substring.
E ele retorna um ponteiro para a posição na primeira string onde a substring é
encontrada, muito semelhante a str char, mas pesquisa uma string inteira. Se não encontrar nenhuma correspondência, ele retorna nulo.
O primeiro argumento é a string que deve ser pesquisada como str char.
Em segundo lugar está a substring que você está procurando, outra string. Então aqui está um exemplo.
É muito parecido com o outro, exceto que em vez de procurar um
único caractere, estamos procurando por uma palavra, uma string.
Portanto, temos palavra, que é igual a cachorro.
E temos um texto que diz que todo cachorro tem seu dia.
Criamos nosso ponteiro novamente porque tem que ser - é isso que a função retorna.
Quando chamamos strstr, passamos no texto a string que queremos ver.
E então o segundo argumento é a palavra que queremos olhar dentro dessa string.
Então ele vai buscar pelo texto a primeira ocorrência da string armazenada em word.
O string dog aparece no sétimo caractere do texto.
Se você olhar para o texto.
O texto sub 6 vai ser igual a cachorro, é aí que começa.
Portanto, o ponteiro irá apontar para o endereço do texto mais 6 dog,
e ele começará aí, e então irá para o terminador nulo.
Então, o cachorro vai ter o seu dia.
E também tenha cuidado porque a pesquisa diferencia maiúsculas de minúsculas.
Se você realmente forneceu um D-O-G maiúsculo, não encontrará nada,
apenas procurará a caixa correta.
Mas isso é usado para encontrar substrings e strings, muito útil porque
muitas vezes em um programa você dirá que faz essa string dentro dessa
string porque é quase semelhante a um grep se você já usou o grep no Linux.
Espero que isto faça sentido. Tokenizando uma string.
Um token é uma sequência de caracteres, um deles string que é limitado por um delimitador, nós sabemos disso.
Um delimitador pode ser qualquer coisa, mas deve ser algo exclusivo dessa string.
Não tenha um delimitador como "A" porque agora ele vai encontrar nessa
string algo válido em uma palavra.
Faça algo único, como um espaço ou uma vírgula. Isso, novamente, é usado como um limite para
geralmente palavras em uma única string.
Portanto, ele divide uma frase em palavras, é chamado de tokenização.
Esta função strtok é usada para tokenizar uma string.
Requer dois argumentos.
A string a ser tokenizada, que é a string inteira que contém os espaços e os delimitadores.
E então a string contendo todos os caracteres positivos limitados.
Você pode especificar o que deseja definir como limite.
Então aqui está um exemplo.
Estamos criando uma matriz de caracteres 80.
Diz olá, como vai você, você é traço, meu nome é traço Jason.
Em seguida, criamos uma string constante que representa o delimitador, que
é o menos, o travessão. Parece um pouco diferente, mas ainda é o menos, o
travessão, ambos são travessões.
E então criamos nosso ponteiro, que é o token.
Porque strtok vai retornar
cada token nosso.
Portanto, se chamarmos nosso strtok e passarmos string
e nossos delimitadores s, o
token será igual à primeira coisa que encontrar.
Então, a primeira vez que você chamar strtok, será igual a hello how
are you space e então encontrará a correspondência com o traço.
E se você ligar
pela segunda vez, será impresso meu nome é.
Se você ligar pela terceira
vez, ele imprimirá Jason porque está passando pelos travessões.
É por isso que temos um loop while aqui. Dizemos que, embora o token não seja igual a
nulo, imprima o token.
E então obtemos o próximo token chamando strtok.
E dizemos null como nosso primeiro parâmetro es
é nosso segundo parâmetro e
então nós, exibimos. Então, vamos examinar isso
em blocos de código, pois isso tornará mais compreensível.
Então, vamos construir isso. Acabamos de ver este exemplo.
Quero mostrar a você qual é a saída, para que fique claro o que está acontecendo aqui.
Então, aqui você verá que ele diz que imprime
o primeiro token, que é olá, como vai você.
Bem, a primeira coisa que ele faz
é encontrar o primeiro token, imprimi-lo, olá, como vai você, meu nome é e depois Jason.
Então agora temos olá, como vai você,
encontra o primeiro traço, imprime-o. Meu nome é encontra o próximo token
e o terceiro é Jason. Mas você precisa chamar o
token três vezes para obter cada um.
O primeiro vai tokenizar no str.
Veja o próximo que você pode passar nulo porque não quer olhar novamente, você só quer pegar o próximo token.
E então você passa um nulo para o segundo e apenas passa um s.
Isso lhe dará o próximo token do já tok str.
Então é assim que você pode usar strtok. Isso ajuda muito na análise.
Você pode analisar algo e obter certos limites.
As últimas funções sobre as quais quero falar são essas funções de análise de strings.
Há uma tonelada deles, então eu apenas providenciei uma pequena mesa aqui.
É inferior, é superior. Ele faz exatamente o que você acha que faria.
Ele testa para ver se um caractere está em minúsculas ou maiúsculas.
Estamos testando certos caracteres, mas eles são usados dentro de strings.
E assim, o argumento para cada uma dessas funções é o caractere que você deseja procurar.
E então todas essas funções retornam um valor diferente de zero do
tipo int se o caractere estiver dentro do conjunto que está sendo testado.
Então, vamos passar caracteres internos procurando por palavras internas.
Se tivermos uma letra maiúscula dentro de uma palavra, ela nos dirá e
podemos usá-la para analisar elementos individuais em uma forma de caractere também.
Portanto, os valores de retorno serão convertidos em verdadeiro ou falso para
que você possa usá-los como booleanos também, o que é bom.
Portanto, se for menor, retornará verdadeiro
se uma palavra ou caractere tiver uma letra minúscula.
Bem, aqui está um bom exemplo que
eu queria percorrer, que contará o número de dígitos de letras em uma string inteira.
Então, vamos executar isso porque ficará claro, mas
o que você deve notar é que estamos criando um
buffer, nosso buffer de entrada, e então estamos criando três inteiros para contar.
Estamos dizendo ao usuário para inserir uma string
com menos de tantos caracteres, e então a lemos.
Em seguida, vamos dar uma olhada nessa string para
ver se ela contém certos caracteres.
E então vamos iterar por meio dessa string,
olhando para cada índice na matriz.
Então aqui está nosso exemplo.
Novamente, buffer é o nosso array de caracteres
que irá armazenar as entradas. Vamos usar o scanf para preencher isso.
Temos que digitar nossa string sem espaços, é uma única string.
Vamos percorrê-lo, percorrer cada elemento no buffer e, em seguida, chamar as
funções is alpha, is digit ou is punct para ver se
esses caracteres estão lá, e então
será incrementado com base nisso, quer seja ou não retorna verdadeiro ou falso e
então exibe quantas letras, dígitos e caracteres de pontuação estão dentro daquela string.
Vamos ver isso.
Vou inserir algo com um monte de letras
maiúsculas, talvez alguns dígitos.
Então, quando eu clicar em voltar, vai contar tudo. Portanto, diz
que minha direção continha 24 letras, 4 dígitos e 1
caractere de pontuação, os dois pontos.
Um pequeno programa bacana que utiliza essas funções de caractere,
mas é útil para analisar uma string porque é isso que
você está fazendo, você está analisando a string, mas
está apenas examinando caractere por caractere. Obrigada.