Você está na página 1de 18

Vetores como parâmetros e

funções de biblioteca para


strings
Algoritmos e Programação – IFSP
Profs. José Osório e Igor Zadi
Argumentos são passados por valor

• O que vai ser impresso?


Parâmetros são passados por valor
• A função não consegue alterar variáveis do chamador
• Exceção: scanf() consegue alterar a nossa variável, porque passamos
por referência (&)
• E se passarmos um vetor como parâmetro, o que acontece?

char str[] = "Hello, world\n";


printf( str);
Vetores são passados por referência
• Mesmo sem usar &
• A função consegue alterar o conteúdo do vetor.
• Na função, há duas maneiras de se declarar o vetor parâmetro:
• tipo nome[] , OU
• tipo *nome
• Dê preferência à primeira forma.
• Ao criar uma função que recebe um vetor como parâmetro, declare
também outro parâmetro para receber o tamanho útil do vetor.
• Exceção: se houver um terminador, como por exemplo nas strings.
• Dentro da função, o vetor foi convertido para um ponteiro.
Exemplo: função somav() – retorna a soma de
um vetor de doubles
double somav(double vetor[], int n) {
// Podia ser também char *vetor
double soma = 0;
for(int i=0; i < n; ++i)
soma += vetor[i];
return soma;
}
No chamador:
double vet = {3.14, 2.72, 1.41, 1.62};
printf("Soma=%g\n",somav(vet, 4));
Exemplo 2: função de biblioteca strlen() –
Calcula o tamanho de uma string
size_t strlen( char str[]) {
int i = 0;
while(str[i])
++i;
return i;
}
char frase[] = "The quick brown fox jumps over the lazy dog";
printf("A frase tem %lld caracteres\n", strlen( frase));
//printf("A frase tem %d caracteres\n", (int)strlen( frase));

• O que tipo é esse, size_t? É um inteiro somente positivo, e capaz de


guardar valores bem grandes.
• Pode atribuir size_t a um int. Se der warning, ignore, ou coloque (int)
antes para converter para inteiro
E retornar um vetor, pode?
• Até pode, mas também por referência, na forma de ponteiro. Só se
usa para vetores novos, criados ou descobertos pela função. Não
veremos isso agora.
• OK, mas eu quero que minha função modifique um vetor, como faço?
• Simples: passe esse vetor como parâmetro. Aí a função consegue
escrever no vetor.
Exercício 1
• Faça uma função dobra(), que duplica o valor de todos os elementos
de um vetor. Ela deve receber como parâmetro o vetor e o tamanho
ocupado do vetor. No seu teste, após chamar a função, imprima o
vetor.
• Exemplo de uso da função:
int vetor[] = { 32, 15, 25, 14};
dobra(vetor, 4); // chama a função
• Aqui vetor contém { 64, 30, 50, 28 }
• O mesmo vetor é entrada e saída da função.
Solução: função que dobra os elementos de
um vetor inteiro
void dobra( int vetor[], int tam) {
for(int i=0; i < tam; ++i)
vetor[i] *= 2;
}

• Note que a função não retorna nada. É um procedimento.


• Se fosse uma função que mudasse o tamanho do vetor, seria natural
que retornasse o novo tamanho.
Funções de biblioteca para vetor de
caracteres
• #include <string.h>
• memcpy( char destino[], char origem[], nbytes)
• Copia nbytes bytes de origem para destino.
• Têm que ser vetores diferentes.
• Serve para copiar qualquer vetor, e não só char.

• memcmp( s0, s1, tamanho)


• Compara s0 com s1, byte a byte
• Retorna 0 se iguais.
• Se diferentes, retorna s0[i] – s1[i], onde i é a posição do primeiro
caractere diferente.
• Estas funções exigem um tamanho e não exigem zero terminador
Funções de biblioteca para strings
• strlen(char str[])
• Retorna o tamanho da string str. É sua responsabilidade garantir que str tenha um
zero terminador.
• strcpy(char destino[], char origem[])
• Copia a string origem para destino, inclusive o zero terminador. A origem tem que ter
um zero terminador e o destino deve ter tamanho suficiente para receber a origem.
• strncpy(destino, origem, n) só copia os primeiros n caracteres. É comum
passarmos em n o tamanho do destino.
• strcmp(s0, s1)
• Compara a string s0 com s1. Retorna 0 se as strings são iguais. Se diferentes, retorna
s0[i] – s1[i], onde i é a posição do primeiro caractere diferente.
• Ao montar uma condição para um if, for ou while, leia o nome desta função como
diferente.
• strncmp(s0, s1, n) só compara os primeiros n caracteres.
Funções printf() para strings
• sprintf(destino, strcontrole, ...)
• É como a printf(strcontrole, ...) mas coloca o resultado em
destino e não na saída padrão.

• snprintf(destino, tamanho, strcontrole, ...)


• É como a sprintf, mas limita o tamanho da string destino.
• Use sempre snprintf com o tamanho do destino, em vez de sprintf().
Para ler strings, crie a função sget()

• Para chamar:
Não use gets(). É obsoleta e perigosa
• fgets(), gets() e scanf("%s",&str) são funções de biblioteca para
receber uma string do teclado.
• gets() e scanf() são inseguras porque não têm proteção contra
overflow. Para números, pode usar scanf().
• São usadas por hackers para quebrar sistemas.
• gets() foi excluída da biblioteca oficial. Não use.
• A fgets() garante que não escreve fora do seu vetor.
• fgets() também serve para ler strings de arquivos.
• scanf(%s) é diferente. Ela lê várias strings, separadas por espaços.
Serve para ler palavras, mas não frases.
Imprimindo strings: use %.nns
• Para imprimir strings que você tem certeza absoluta que possuem um
zero terminador, use %s:
printf("%s\n", vetor);
• Se você não pode garantir que a string possui um zero terminador, é
melhor limitar a impressão com %.nns, onde nn é o tamanho máximo
impresso, com 1 ou mais dígitos:
printf("%.80s\n", vetor); // OU,
printf("%.200s\n", vetor);
• Desse modo, você não corre o risco de ver a sua tela cheia de
"sujeira".
Acentos, estilo anos 90
1. Salve seu programa fonte em codificação ANSI. Para converter no
Notepad++ use: Formatar, Converter para ANSI.
2. Inclua o header <locale.h>. Na primeira linha do seu main(), use:
setlocale(LC_ALL, "Portuguese") // Pode ser LC_CTYPE
3. No PowerShell, comande: chcp 1252
• Com esta solução, você pode usar acentos em comentários, strings,
printfs, e entradas do usuário no teclado. 1 letra = 1 byte. Tudo
funciona.
• Nem tudo. Não aceita emojis, nem caracteres em línguas não
ocidentais. É uma solução considerada obsoleta.
• Só funciona no Windows.
Exercício 2
• Faça um programa papagaio.c, que, repetidamente, pergunta uma
string para o usuário e a imprime. Use sget() e proteja sua impressão.
Saia quando o primeiro caractere digitado for '#'. Depois que
funcionar, defina um tamanho pequeno para o vetor e teste se
funciona mesmo para strings maiores que o vetor.
Exercício 3
Poda strings: Faça um programa que pergunte ao usuário um número
inteiro n, uma só vez, e depois, repetidamente, pergunte uma string e
imprima esta string, porém limitada a n caracteres. O programa deve
encerrar quando o usuário digitar uma string vazia (Enter).
Exemplo: "Digite N: " 4
"Digite uma string: " abcdefg
abdc
"Digite uma string: " 12345
1234
"Digite uma string: " paralelepidedo
para
"Digite uma string: " IF
IF
"Digite uma string: "

Você também pode gostar