Você está na página 1de 8

STRING

Leitura de string:

Para a leitura de apenas uma palavra, usa-se:

char a[100];
scanf(" %s", a);

Para a leitura de uma frase (parando na quebra de linha), usa-se:

char a[100];
scanf(" %[^\n]", a); //ou -> scanf(" %[^\n]s", a);

Obs1: Como demonstrado nos exemplos, sempre coloque um espaço antes da leitura de uma
string.
Obs2: Sempre declare o tamanho da string um pouco maior do que o tamanho que você
pretendia usar.

Funções mais usadas da biblioteca <string.h>:

strlen é a função que retorna a quantidade de caracteres de uma string:

char a[100] = "boa prova";


int tam = strlen(a);

Neste caso, tam = 9, “boa” 3 caracteres, espaço 1 caracter, “prova” 5 caracteres, totalizando 9
caracteres.

strcpy é a função que copia uma string de uma variável e cola em outra variável:

char a[100] = "boa prova";


char b[100];
strcpy(b , a);

O primeiro parâmetro do função strcpy é quem vai receber o valor do segundo parâmetro, então
a variável b se tornaria uma cópia da variável a , tendo então o valor “boa prova”.
strcmp é a variável de comparação de string:

Notem que com string não é mais possível fazer a verificação de igualdade com ==, como por
exemplo:

char a[100] = "ufal";


char b[100] = "ufal";

if(a == b){
printf("entrou!!\n");
}

isso nunca entrará, logo a forma de fazermos a comparação com duas strings mudará e então
será utilizada a função strcmp, que ficaria assim:

char a[100] = "ufal";


char b[100] = "ufal";

if(strcmp(a, b) == 0){
printf("entrou!!\n");
}

neste exemplo, a função strcmp, faria a verificação se a é igual a b, caso isso seja verdade a
função retorna 0, caso tivéssemos na nossa variável a a string ”aaa” e em nossa variável b a
string “ab”, o retorno da função seria -1, pois a string do primeiro parâmetro é menor (na ordem
alfabética) que a string do segundo parâmetro. E se caso nossa variável a tivesse a string “ab” e
nossa variável b tivesse a string “aaa”, o retorno da função seria 1, identificando que a string do
primeiro parâmetro é maior (na alfabética) que a string que está no segundo parâmetro.

Exemplos de casos de prova antigas nossas, que poderíamos adaptar para string e usar strcmp:

Suponha que guerreiro ganha de arqueiro, se usássemos com Char pegando apenas a primeira
letra dos nomes, e fizéssemos uma verificação para saber se char1 ganharia de char2, seria
simples, ficaria mais ou menos como essa verificação:

if(char1 == 'g' && char2 == 'a')

Mas e se pedirmos para você verificar a string inteira, ao invés de apenas uma letra?
Simples, supondo o mesmo exemplo de guerreiro e arqueiro, teríamos:

if(strcmp(char1 , "guerreiro") == 0 && strcmp(char2 , "arqueiro") == 0 )


Matriz

Leitura:

int linhas = 3;
int colunas = 3;

int matriz[linhas][colunas];

for(int i = 0; i < linhas; i++)


{
for (int j = 0; j < colunas; j++)
{
scanf("%d", &matriz[i][j]);
}

Passagem de matriz para outra função:

passando:

funcao(linhas, colunas, matriz);

recebendo:

void funcao(int linhas, int colunas, int matriz[][colunas])

Obs1: é obrigatório o valor da coluna antes da matriz.


Obs2: é obrigatório colocar o valor da coluna no segundo colchete da matriz.

Percorrendo a matriz, como um mapa:

Se a matriz tem que ser percorrida como um mapa e é válido percorrer em qualquer posição
dentro da matriz, note que existem posições que seriam inválidas, ou seja, essas posições
estariam fora da nossa matriz. Suponham que os seguintes caracteres tem as seguintes
responsabilidade:

C -> ir para cima


D -> ir para direita
B -> ir para baixo
E -> ir para esquerda
Suponham:

int linhas = 3;
int colunas = 3;

int matriz[linhas][colunas];

Se estivermos na linha inicial da nossa matriz, ou seja, matriz[0][j] tornasse inválido o comando
C, pois seria a subida de uma linha, e a posição matriz[-1][j] não existe.
Se estivermos na última linha da matriz, ou seja, matriz[linhas-1][j], tornasse inválido o comando
B, pois seria a descida de uma linha, e a posição matriz[linhas][j] não existe.
Se estivermos na coluna inicial da nossa matriz, ou seja, matriz[i][0] tornasse inválido o comando
E, pois se formos para a esquerda da coluna 0, ficaríamos na posição matriz[i][-1], que não
existe.
Se estivermos na última coluna da matriz, ou seja, matriz[i][colunas-1] tornasse inválido o
comando D, pois se formos para a direita da colunas-1, ficaríamos na posição matriz[i][colunas],
que não existe.

STRUCT

Com typedef:

typedef struct
{
/* data */
}NOME_STRUCT;

int main(){

NOME_STRUCT variavel;
return 0;
}
Sem typedef:

struct NOME_STRUCT
{
/* data */
};

int main(){

struct NOME_STRUCT variavel;


return 0;
}

Neste PDF, iremos fazer a abordagem com typedef.

Em struct, falando de uma forma “grosseira”, você consegue colocar várias variáveis dentro de
uma só variável. Imagine que você quer fazer uma locadora, e quer armazenar os filmes, você
poderia fazer uma struct com coisas importantes sobre o filme, dentro da struct. Exemplo:

typedef struct
{
char nome[50]; //nome do filme
int ano; //ano do lançamento
double nota; //nota média do filme
}FILMES;

Mas surge a pergunta. Como faríamos pra ler essa variável? simples, veja o exemplo a seguir:

int main(){

FILMES filme;

scanf(" %s %d %lf", filme.nome, &filme.ano, &filme.nota);


printf("nome: %s\nano: %d\nnota: %.2lf", filme.nome, filme.ano,
filme.nota);

return 0;}

Desta maneira (variavel.variavel), você acessa o local no qual deseja dentro da struc. Mas, note
que se fizer desta forma, só conseguiremos armazenar 1 filme em nossa struct, e se quisermos
adicionar mais, como fazemos? Simples, basta você dizer que essa sua variável do tipo struct é
um array, logo, cada posição do array vai ser um filme diferente. Exemplo de leitura:

int main(){

int x = 5; //também pode ser lido com o scanf


FILMES filme[x];

for(int i = 0; i < x; i++)


{
scanf(" %s %d %lf", filme[i].nome, &filme[i].ano, &filme[i].nota);
}
for(int i = 0; i < x; i++)
{
printf("nome: %s\nano: %d\nnota: %.2lf", filme[i].nome,
filme[i].ano, filme[i].nota);
}

return 0;
}

Neste exemplo determinamos que terá um espaço para leitura de 5 filmes diferentes, mas
também é possível fazer um scanf para ler o valor de x, e ter mais filmes diferentes.
Passagem por parâmetro:

Sem array, e alterando os valores do endereço:

typedef struct
{
char nome[50]; //nome do filme
int ano; //ano do lançamento
double nota; //nota média do filme
}FILMES;

void funcao(FILMES* filme){


scanf(" %s %d %lf", filme->nome, &filme->ano, &filme->nota);

int main(){
FILMES filme;

funcao(&filme);
printf("nome: %s\nano: %d\nnota: %.2lf", filme.nome, filme.ano,
filme.nota);
return 0;
}

Note que na função em que definimos que nossa variável do tipo struct é um ponteiro, deixamos
de fazer a referencia(variavel.variavel) e começamos a fazer(variavel->variavel), mas na função
em que eu não declaro como ponteiro, na main por exemplo, eu continuo usando
(variavel.variavel).
Com array, e claro, também alterando os valores do endereço:

typedef struct
{
char nome[50]; //nome do filme
int ano; //ano do lançamento
double nota; //nota média do filme
}FILMES;

void funcao(FILMES filme[], int x){


for(int i = 0; i < x; i++)
{
scanf(" %s %d %lf", filme[i].nome, &filme[i].ano, &filme[i].nota);
}
}

int main(){
int x = 5; //também pode ser lido com o scanf
FILMES filme[x];

funcao(filme, x);
for(int i = 0; i < x; i++)
{
printf("nome: %s\nano: %d\nnota: %.2lf", filme[i].nome, filme[i].ano,
filme[i].nota);
}

return 0;
}

Note que com array, você pode continuar usando a referência (variavel.variavel), mesmo numa
função diferente.

Dúvidas entrem em contato via whatsapp:

João Pedro
Túlio Cerqueira
José Willamys
Gabriel Barbosa

Você também pode gostar