Olá, seja bem-vindo de volta. Nesta palestra,
quero falar sobre a criação de uma string, especificamente
como você pode fazer isso em c usando um array de caracteres.
Eu tendo a usar os termos string e strings de caracteres de forma intercambiável.
Mas, na verdade, uma string de caracteres é o array char sobre o qual vamos falar.
É um conceito muito importante.
Agora poderemos utilizar palavras e texto em nosso programa para fazer todo tipo de coisa.
Agora, o próprio c não tem nenhum tipo de dados que represente uma string.
Não há nada aqui. Muitas linguagens oferecem suporte a
um objeto ou a um tipo de dados do tipo string.
Agora, como não há tipo de dados c na string, você não
pode usar nenhum dos operadores na string.
Então, o que vamos acabar fazendo é acabar usando a biblioteca padrão e há todos os tipos
de funções de string sobre as quais falaremos.
Temos três palestras dedicadas às várias funções de string que você pode empregar.
E isso nos ajudará a manipular as strings, obter informações sobre as strings.
Mas você não pode utilizar operadores em strings, sem adição
ou subtração de strings, nada disso.
Strings em c são armazenados em uma matriz do tipo char.
Nós sabemos o que é um array. Nós sabemos o que é um tipo de char.
Um tipo char é um único caractere, uma matriz em que você
pode simplesmente armazenar vários elementos no mesmo nome.
Portanto, faz sentido que uma string esteja dentro de uma matriz de
caracteres porque uma string tem muitos caracteres.
Assim, os caracteres de uma string são armazenados em células de memória adjacentes, um caractere por célula.
Você pode acessá-lo da mesma forma que acessa um array.
Mas a forma como você realmente declararia uma string e veria é que simplesmente usaria o tipo
char e depois os colchetes para indicar o tamanho, assim como um array normal
se você fosse criá-lo de um tipo diferente.
Char e, em seguida, qualquer que seja o seu nome e, em seguida, o
tamanho da matriz de caracteres entre colchetes.
É assim que você pode declarar uma string em c.
Agora, quando você declara a string em c assim, não
há dados reais associados a. Você está apenas especificando o tamanho.
Essa é a maneira mais simples.
Portanto, a variável pode acomodar uma string que contém até 19 caracteres.
Lembre-se desse caractere nulo.
Se você disser que o tamanho da string será 20, isso significa que apenas
19 caracteres podem ser armazenados, porque
você precisa ter aquele caractere extra para o nulo.
Tenha isso em mente, declarar uma matriz de caracteres é 20 significa
que 19 caracteres podem ser armazenados lá.
Quando você especifica a dimensão de uma matriz que pretende usar antes de uma string - para
armazenar uma string, ela
deve ser pelo menos um maior que o número de caracteres da string que deseja armazenar.
O compilador adicionará automaticamente o terminador nulo ao final de cada constante de string.
Portanto, o que você realmente deve fazer é
inicializá-las ao criar essas cadeias de caracteres.
Portanto, você pode inicializar uma variável de string da mesma forma que inicializa um array.
Você coloca cada caractere dentro desses colchetes.
Portanto, isso se parece muito com se você fosse inicializar elementos em uma matriz de inteiros.
Mas se você disser char word e, em seguida,
dentro dos colchetes ondulados, você colocará cada caractere único que
criará uma matriz de caracteres.
Portanto, é o mesmo que qualquer outra inicialização de array.
Na ausência de colocar o tamanho, o
compilador c calcula automaticamente o número de elementos na matriz e adiciona um para o terminador nulo.
Portanto, é baseado no número de inicializadores que você tem entre os
colchetes, chaves.
Essa instrução vai reservar espaço e memória para exatamente sete
caracteres, ponto de exclamação h-e-l-l-o
e, em seguida, o terminador nulo, e este pequeno diagrama à direita mostra isso.
Automaticamente e adicionando aquele terminador nulo. Agora seria realmente uma
dor de cabeça se você sempre tivesse que
inicializar suas matrizes de caracteres com aspas simples seguidas por vírgulas.
Então, o que você pode fazer é até mesmo a notação abreviada é simplesmente colocar aspas duplas ao redor disso.
Então você pode especificar a string explicitamente, como no primeiro exemplo, e então
você teria que usar uma função de string apenas para
aplicar dados a ela ou
você pode deixar o compilador fazer isso por você.
O problema em fazer isso explicitamente é que você sempre deve se lembrar de adicionar aquele caractere extra
para o nulo.
Portanto, o que você realmente deve fazer é deixar o compilador descobrir por você.
Portanto, não coloque nenhum número dentro desses colchetes para o tamanho.
Porque se o tamanho especificado for muito pequeno, o compilador não pode ajustar o
caractere nulo de terminação no final do array e ele não coloca um lá e não
vai dizer a você que não colocou um lá.
Então você vai ter um bug em seu programa e nem vai saber disso.
A prática recomendada é quando você está usando um literal de
string e está inicializando uma string para permitir que o compilador descubra o tamanho para você.
Faça um tamanho maior ou algo assim e, em seguida, basta colocá-lo lá e ele descobrirá o tamanho para você.
Portanto, não especifique o tamanho. Deixe o compilador descobrir.
Dessa forma, você pode ter certeza de que tudo estará correto.
Apenas deixe esses colchetes como colchetes vazios
e atribua-os ao operador de atribuição e, em seguida, entre
aspas duplas, você pode colocá-lo. Você nem precisa dos colchetes.
Esta é a melhor prática. Vamos ver um exemplo.
Você também pode inicializar apenas parte de uma
matriz de elementos do tipo char com uma string.
Então, se você realmente criou um tamanho que era muito grande
e atribuiu apenas alguns caracteres, tudo bem também,
você está inicializando apenas alguns dos caracteres. Todos os outros personagens
ficarão vazios.
O que acontecerá aqui é que o compilador inicializará os primeiros cinco elementos.
Str zero a str quatro, todos os
caracteres da constante de string e, em seguida, string sub 5
conterão o caractere nulo.
O espaço ainda será alocado para todos os
40 elementos na matriz, mas apenas cinco deles serão usados, quatro mais o caractere nulo.
Portanto, novamente, sua prática recomendada não especifica um número dentro do tamanho, apenas
atribua a ele um literal de string usando aspas duplas.
É isso que você vai acabar vendo.
Agora, se você não inicializou e acabou de criar o
array de caracteres com um tamanho, como colocar a data nele.
Bem, por ser um array, você não pode simplesmente atribuir dados.
Sabemos que se tivéssemos um array inteiro, não podemos simplesmente
atribuir o número cinco a um array inteiro,
isso não faz sentido. Você tem que especificar os elementos reais.
Você tem que especificar os índices.
Portanto, você não pode fazer algo como declarar uma matriz de caracteres com 100 caracteres e dizer
s é igual a olá. Isso não vai funcionar.
Porque, novamente, s é um array. Mesmo que seja uma string entre aspas duplas, ainda é um array na memória.
Portanto, se você estiver executando uma operação de atribuição, não poderá atribuir
um array de caracteres a outro array de caracteres como o acima.
Se você quiser atribuir dados a
um array de caracteres depois de declarar e depois de inicializá-lo, você
deve usar uma função especial chamada str copy.
E vamos falar sobre isso em outra palestra.
Então, até este ponto, quando você cria suas strings, elas serão literais de
string, elas estarão entre aspas duplas e você nunca irá modificá-las.
Portanto, isso também é perfeitamente válido. Você pode, na verdade, apenas acessar
esses caracteres ou cada elemento na matriz pelo índice e especificar cada caractere.
Então s sub 0, s sub 1 e, em seguida, coloque um único caractere entre aspas simples.
Você poderia atribuí-lo dessa forma. Mas imagine se você tivesse uma string de 100 bytes.
Isso vai exigir muitas linhas de código. Então você não quer fazer isso.
O que você vai querer fazer é inicializá-lo
ao declará-lo sem tamanho e, em seguida,
especificar se deseja modificá-lo por cópia.
No que diz respeito a exibir uma string como saída, ainda vamos usar a função printf.
Quando você quiser se referir a uma string em qualquer lugar em seu programa, você apenas
usa o próprio nome do array.
Você não precisa especificar índices.
Porque os índices dentro do array irão especificar um único caractere.
Se você quiser a string inteira, basta usar o nome do array.
Portanto, se você estiver usando a função printf para exibir a
saída, basta fazer o seguinte. Dentro das aspas duplas, você
usaria um percentual s como seu especificador de formato e, em seguida, apenas o nome da matriz de caracteres.
Portanto, você não o trata como outros arrays quando deseja acessá-lo. Quando você deseja acessá-lo, basta o nome,
sem índices reais ou colchetes.
E a porcentagem como especificador de formato é para a saída
de uma string terminada em nulo. Lembre-se de que antes de usarmos percent
d para inteiros, você pode usar percent c para caracteres.
Para strings, você usa percent s, e essas são matrizes de caracteres.
Ele espera alguma string terminada em nulo.
Portanto, você inicializa a string se o fez sem tamanho e o terminador
nulo foi adicionado automaticamente ou se
você o criou com um tamanho específico e o adicionou ou
se adicionou explicitamente, não importa. Ele apenas tem que ser terminado em null
A função printf assume que se encontra o especificador de formato de porcentagem s
de que o argumento correspondente é uma cadeia de caracteres que termina com um caractere nulo.
É isso que ele espera, então tem que ser assim.
Para inserir uma string, sabemos como inserir outros
conjuntos de dados por meio do teclado usando scanf.
Faremos a mesma coisa para inserir strings.
Vamos usar uma função scanf. Com a função scanf, será
da mesma maneira, exceto que você usará um especificador de formato diferente.
Portanto, para strings, você usará um percentual s como entrada.
E isso é usado para inserir uma string.
A outra coisa a observar aqui é que não há e comercial para o nome
da variável porque é um caractere. Lembre-se de que mencionamos que você só
precisa fornecer o "e" comercial o endereço do operador nas strings.
A razão disso é que, quando falamos sobre ponteiros, tudo fica mais claro.
Mas a entrada char, embora seja um array
de caracteres, é um ponteiro, e scanf como seu segundo argumento leva um ponteiro.
E é por isso que você não precisa fazer isso. Quando você declara números inteiros e duplos, esses não
são ponteiros e. Portanto, se
você quiser ler a entrada do teclado usando scanf, o segundo argumento espera um ponteiro que
você deve passar em um endereço.
Agora com o scanf quando você faz
uma string, o scanf só vai ler até o espaço.
Portanto, se você fizer scanf e digitar Jason,
será um instrutor.
A única coisa que será armazenada na entrada é Jason. Porque uma vez que atinge
aquele espaço, não vai ler o resto da string.
Portanto, há outras funções que você pode usar para ler a string inteira.
Alguns dos exemplos que usaremos provavelmente farão isso. Você pode fazer coisas como f get
s, que é outra maneira de ler a entrada do teclado e que lerá a
string inteira, independentemente dos espaços.
Mas há outro que eu acho que é
chamado de get underscore s para
C11, mas falaremos mais sobre isso, mas isso é apenas uma coisa
a lembrar quando estiver lendo entradas para strings. Só vai ler todo o caminho até o espaço.
Que tal testar se duas strings são iguais.
Bem, até este ponto, testamos todas as
variáveis para ver se são iguais, apenas usamos igual a igual.
Mas com cordas, isso não vai funcionar.
O operador de igualdade, lembre-se, dissemos que strings são matrizes de caracteres, portanto, você não pode usar operadores nelas.
E o operador de igualdade só pode ser aplicado a ints e
doubles ou floats ou caracteres.
Ele não funciona em estruturas ou matrizes. Você não pode comparar duas matrizes.
Portanto, não vai funcionar com cordas. Se você deseja determinar se duas cadeias de
caracteres são iguais, você deve comparar explicitamente as duas cadeias de caracteres caractere por caractere.
Portanto, você teria que olhar para cada elemento no índice
do array por índice.
No entanto, isso é realmente um grande problema porque seria muito tedioso.
Então, vamos falar sobre como você pode fazer isso
facilmente usando uma função str compare da biblioteca padrão, mas você
não pode usar igual a igual, lembre-se disso.
E, novamente, apenas como um lembrete, eu já disse algumas vezes e quero dizer novamente,
a constante de string x entre aspas duplas
não é a mesma que a constante de caractere x entre aspas simples.
X entre aspas simples é um tipo básico, é apenas char
ou cuidado.
X entre aspas duplas é um tipo de unidade, é um array do tipo char.
X entre aspas duplas realmente consiste em dois caracteres, ox e
o terminador nulo, o caractere nulo, portanto, tenha isso em mente.
Aqui está um
exemplo de como podemos criar strings
declarando-as com um tamanho ou inicializando-as na mesma linha.
Agora, esta é a melhor prática. Se você for usar literais de string,
o que eu faria
é fazer o que diz aqui, criar a matriz de caracteres, não
especificar um tamanho e, à direita do operador de atribuição, colocar aspas duplas.
O compilador criará automaticamente a string certa e adicionará um terminador nulo a ela.
Se você especificar um tamanho e não tiver caracteres suficientes, ele não será armazenado.
Portanto, basta criar literais de string de caracteres
usando o tipo de dados char,
o nome da variável e os colchetes vazios.
Este programa vai, eu acho, contar os caracteres em
um array, então essencialmente vai obter o comprimento da string.
O que estamos fazendo aqui é criar uma variável chamada contagem em duas matrizes de
caracteres com duas strings diferentes, ser ou não ser e,
então, a vírgula é a questão.
Char str um terá um alternador para depois de b, e
str terá uma alternativa após a pergunta.
Portanto, temos um loop aqui que vai até
o primeiro array, de count igual a zero até ver um terminador nulo.
E podemos usar o não é igual neste caso porque estamos comparando um personagem.
Terminador nulo como um personagem. É perfeitamente normal comparar personagens.
Portanto, nosso loop while irá até ver um terminador nulo.
Assim que virmos um terminador nulo, vamos pular para fora.
A contagem será igual ao número de caracteres dessa string.
Portanto, é o comprimento dessa corda.
Fazemos isso para ambas as cordas. E você vai notar que basicamente
ambas as strings terão o comprimento correto porque estamos apenas examinando cada uma.
Para b ou não para b será algo como
18 caracteres.
Agora, você nunca vai realmente precisar fazer algo assim, porque
temos uma ótima função auxiliar com comprimento str para encontrar comprimentos de strings.
Mas, novamente, o que isso está demonstrando é o fato de que é uma matriz.
E se você quiser comparar ou encontrar o comprimento de uma string, você pode
usar o not equals e olhar para o caractere, o terminador nulo.
Eu espero que isso tenha sido útil. É assim que vamos definir e inicializar literais de string.
Obrigada.