23
- Strings Seguindo o raciocínio anterior, nomes de strings, são do tipo char*. Isto nos permite explorar os conceitos apresentados para resolver problemas como, por exemplo, o apresentado no Ponteiros 376 problemas como, por exemplo, o apresentado no exercício a seguir.

-Strings Seguindo o raciocínio anterior, nomes de strings

  • Upload
    others

  • View
    19

  • Download
    0

Embed Size (px)

Citation preview

Page 1: -Strings Seguindo o raciocínio anterior, nomes de strings

- Strings

Seguindo o raciocínio anterior, nomes destrings, são do tipo char*. Isto nos permiteexplorar os conceitos apresentados para resolverproblemas como, por exemplo, o apresentado no

Ponteiros

376

problemas como, por exemplo, o apresentado noexercício a seguir.

Page 2: -Strings Seguindo o raciocínio anterior, nomes de strings

Exercício:

Construa um programa que declare um vetor destrings com 10 elementos e o inicialize comnomes fornecidos pelo usuário através da entradapadrão e em seguida o retorne na saída padrão.

Ponteiros

377

padrão e em seguida o retorne na saída padrão.A manipulação do vetor deve ser feita por meio deum ponteiro.

Page 3: -Strings Seguindo o raciocínio anterior, nomes de strings

#include <stdio.h>#define tamanho 10#define comprimento_max 100main () {

char vetor_strings[tamanho][comprimento_max],*p;int i;for (i=0, p=vetor_strings[0]; i<tamanho; i++){

printf ("\nEntre com a string[%d]: ",i+1);

378

printf ("\nEntre com a string[%d]: ",i+1);scanf("%99[^\n]", p); /*caso seja necessário lembre-se de limpar o buffer de entrada*/p+=comprimento_max;

} printf ("\nString digitadas:");for (i=0, p=&vetor_strings[0][0]; i<tamanho;

p+=comprimento_max, i++)printf ("\nString[%d]: %s", i+1, p);

}

Page 4: -Strings Seguindo o raciocínio anterior, nomes de strings

- Endereços de elementos de vetores

Nesta seção vamos apenas ressaltar, oumelhor, reforçar que a notação

&nome_da_variável[índice]

no caso de uma declaração do tipo

Ponteiros

379

no caso de uma declaração do tipo

tipo_elemento nome_da_variável[num_elementos];

é válida e retorna o endereço do ponto do vetor indexado por índice.

Page 5: -Strings Seguindo o raciocínio anterior, nomes de strings

- Inicializando Ponteiros

Podemos inicializar, ponteiros de um jeito, nomínimo interessante.

Precisamos, para isto, entender como alinguagem C trata as strings constantes.

Toda string que o programador insere no

Ponteiros

380

Toda string que o programador insere noprograma é colocada num banco de strings que ocompilador cria. No local onde está uma stringconstante no programa, o compilador coloca oendereço do início daquela string (que está nobanco de strings).

Page 6: -Strings Seguindo o raciocínio anterior, nomes de strings

- Inicializando Ponteiros (continuação)

É por isto que podemos usar strcpy() do seguinte modo:

strcpy (string,"String constante.");

Ponteiros

381

strcpy() solicita dois parâmetros do tipo char*.Como o compilador substitui a string "Stringconstante." pelo seu endereço no banco destrings, os argumentos da função strcpy() estãocoerentes.

Page 7: -Strings Seguindo o raciocínio anterior, nomes de strings

- Inicializando Ponteiros (continuação)

O que isto tem a ver com a inicialização deponteiros?

É que, para uma string que vamos usar váriasvezes, podemos fazer:

Ponteiros

382

char *str1="String constante.";

Aí poderíamos, em todo lugar que precisarmosda string, usar a variável str1. Devemos apenastomar cuidado ao usar este ponteiro. Pois, se oalterarmos vamos perder a string e se o usarmospara alterar a string podemos facilmente corrompero banco de strings que o compilador criou.

Page 8: -Strings Seguindo o raciocínio anterior, nomes de strings

- Inicializando Ponteiros (continuação)

OBS.: Em C existem modificadores de acesso,um exemplo é o modificador const que permitecriar uma constante.

Exemplo:

Ponteiros

383

const int numero = 32;

Logo, podemos fazer:

const char *str1="String constante.";

Desta forma o endereço apontado pelo ponteironão pode ser alterado.

Page 9: -Strings Seguindo o raciocínio anterior, nomes de strings

Ponteiros / Vetores e Strings

Agora podemos concluir nosso estudo dasFunções Básicas para manipulação de Strings.

- strstr

Sua forma geral é:

384

char *strstr (const char *str1, const char *str2);

A função strstr() devolve um ponteiro para aprimeira ocorrência da string apontada por str2 nastring apontada por str1. Ela devolve um ponteironulo se não for encontrada nenhuma coincidência.Obs.: Função presente em string.h.

Page 10: -Strings Seguindo o raciocínio anterior, nomes de strings

Ponteiros / Vetores e Strings

/* Exemplo strstr */

#include <stdio.h>

#include <string.h>

main()

{

385

{

char *p;

p = strstr(“isto é um teste”, “te”);

puts(p);

}

Page 11: -Strings Seguindo o raciocínio anterior, nomes de strings

Exercício:

Construa um programa que receba duas stringsfornecidas pelo usuário, verifique se a segundastring está presente na primeira e, caso estejaretorne a posição do caractere na primeira string

Ponteiros / Vetores e Strings

386

retorne a posição do caractere na primeira stringonde a primeira ocorrência da segunda stringinicia, caso contrário retorne zero.

Page 12: -Strings Seguindo o raciocínio anterior, nomes de strings

Ponteiros / Vetores e Strings

- strchr

Sua forma geral é:

char *strchr (const char *str, int ch);

A função strchr() devolve um ponteiro à primeira

388

A função strchr() devolve um ponteiro à primeiraocorrência do byte menos significativo de ch nastring apontada por str. Se não for encontradanenhuma coincidência, será devolvido um ponteironulo.

Page 13: -Strings Seguindo o raciocínio anterior, nomes de strings

Ponteiros / Vetores e Strings

/* Exemplo strchr */

#include <stdio.h>

#include <string.h>

main()

{

389

{

char *p;

p = strchr(“isto eh um teste”, ‘ ’);

printf(p);

}

Page 14: -Strings Seguindo o raciocínio anterior, nomes de strings

- Vetores de ponteiros

Podemos construir vetores de ponteiros comodeclaramos vetores de qualquer outro tipo.

Um exemplo de declaração de um vetor deponteiros inteiros é:

Ponteiros

390

ponteiros inteiros é:

int *pmatrx [10];

No caso acima, pmatrx é um vetor quearmazena 10 ponteiros para inteiros.

Page 15: -Strings Seguindo o raciocínio anterior, nomes de strings

- Ponteiros para Ponteiros

Podemos declarar um ponteiro para um ponteiro com a seguinte notação:

tipo_da_variável **nome_da_variável;

Ponteiros

391

Algumas considerações:

**nome_da_variável é o conteúdo final davariável apontada;

*nome_da_variável é o conteúdo do ponteirointermediário.

Page 16: -Strings Seguindo o raciocínio anterior, nomes de strings

- Ponteiros para Ponteiros (continuação)

Na linguagem C podemos declarar ponteirospara ponteiros para ponteiros, ou então, ponteirospara ponteiros para ponteiros para ponteiros eassim por diante.

Ponteiros

392

assim por diante.

Para fazer isto basta aumentar o número deasteriscos na declaração.

Para acessar o valor desejado apontado por umponteiro para ponteiro, o operador asterisco deveser aplicado duas vezes, como mostradoanteriormente e no exemplo a seguir:

Page 17: -Strings Seguindo o raciocínio anterior, nomes de strings

- Ponteiros para Ponteiros (continuação)

#include <stdio.h>main(){

float pi = 3.1415, *pf, **ppf;

Ponteiros

393

float pi = 3.1415, *pf, **ppf;pf = &pi;ppf = &pf;printf(“\n%.4f", **ppf);printf(“\n%.4f", *pf);

}

Page 18: -Strings Seguindo o raciocínio anterior, nomes de strings

Exercício:

Verifique o programa abaixo. Encontre o(s)seu(s) erro(s) e corrija-o(s) para que o mesmoescreva o número 10 na tela.

#include <stdio.h>

Ponteiros

394

#include <stdio.h> main() {

int x, *p, **q; p = *x; q = &p; x = 10; printf("\n%d\n", &q);

}

Page 19: -Strings Seguindo o raciocínio anterior, nomes de strings

Funções são as estruturas que permitem aousuário separar seus programas em blocos(subprogramas). Para fazermos programas grandese complexos temos de construí-los bloco a bloco.

Uma função na linguagem C tem a seguinte forma

Funções

395

Uma função na linguagem C tem a seguinte formageral:

tipo_de_retorno nome_da_função (declaração_de_parâmetros)

{ corpo_da_função

}

Page 20: -Strings Seguindo o raciocínio anterior, nomes de strings

O tipo-de-retorno é o tipo de variável que a funçãovai retornar. O default é o tipo int, ou seja, o tipo-de-retorno assumido por omissão. A declaração deparâmetros é uma lista com a seguinte forma geral:

tipo nome1, tipo nome2, ... , tipo nomeN

Observe que o tipo deve ser especificado para

Funções

396

Observe que o tipo deve ser especificado paracada uma das N variáveis de entrada. É nadeclaração de parâmetros que informamos aocompilador quais serão as entradas da função(assim como informamos a saída no tipo-de-retorno).

É no corpo da função que as entradas sãoprocessadas, saídas são geradas ou outrasoperações são executadas.

Page 21: -Strings Seguindo o raciocínio anterior, nomes de strings

- Comando return

Forma geral:

return valor_de_retorno; ou return;

Funções

397

Quando se executa uma declaração return afunção é encerrada imediatamente e, se o valor deretorno é informado, a função retorna este valor. Éimportante lembrar que o valor de retornofornecido tem que ser compatível com o tipo deretorno declarado para a função.

Page 22: -Strings Seguindo o raciocínio anterior, nomes de strings

- Comando return (exemplo 1)

#include <stdio.h>int Square (int a){

return (a*a);}main (){

398

{int num;printf ("\nEntre com um numero: ");scanf ("%d",&num);num=Square(num);printf ("\n\nO seu quadrado vale: %d\n",num);

}

Page 23: -Strings Seguindo o raciocínio anterior, nomes de strings

- Comando return (exemplo 2)

#include <stdio.h>int Square (int a){

return (a*a);}main (){

399

{int num;printf (“\nEntre com um numero: ");scanf ("%d",&num);printf ("\n\nO seu quadrado vale: %d\n", Square(num));

}