Você está na página 1de 1

Trabalhando com strings Prof.

Bruno Feij

Escrever funes que manipulam strings basicamente passear com o ponteiro e interromper quando o
terminador encontrado. E no importa se a string foi armazenada de modo esttico ou dinmico 1.

A funo strlen, que recebe um string e retorna o seu tamanho, um timo exemplo para explicar como
trabalhamos com strings. Observe que o tamanho de "puc" 3, o de "eu" 2 e o
tamanho da string vazia "" zero; ou seja: no contamos o terminador \0. No exemplo
da Fig. 1, o vetor a armazena uma string de tamanho 3 (apesar de ocupar 4 endereos
Fig. 1 de memria).

Em C, a indexao de vetor e aritmtica de ponteiro so equivalentes, mas ponteiros e nomes de vetor so


diferentes. Nomes de vetor so ponteiros constantes (imutveis). De qualquer maneira, passeamos pelo string
usando aritmtica de endereos, quer pela sintaxe [], quer pela sintaxe + , i.e. a[2] *(a+2).

Para o iniciante, a sintaxe [] parece ser a mais confortvel:

int strlen(char * s) int strlen(char * s) int strlen(char * s)


{ { {
int i; int n; int n = 0;
int n = 0; /* contador */ for (n=0; s[n] != '\0'; n++) while(s[n] != '\0')
for (i=0; s[i] != '\0'; i++) ; n++;
n++; return n; return n;
return n; } }
}

A rigor, o teste s[n] != '\0' pode ser simplificado para s[n] apenas:

int strlen(char * s)
{
int n = 0;
while(s[n])
n++;
return n;
}

O teste em um while (ou um for, ou um if) uma expresso booleana que retorna 0 se falso e diferente de
zero se verdadeiro (i.e., verdadeiro pode ser 1, 99, -5, ). Portanto, lembrando que o nico caractere que
tem valor zero o terminador \0, basta verificar diretamente o valor de s[n]. Se voc achar isto estranho, veja
os seguintes exemplos com if:

if (2 5) printf(oi\n); // imprime oi
if (2 5) printf(oi\n); // nada imprime

O trabalho com strings est muito ligado a manipulao de ponteiros. Portanto, em vrias funes com string,
programadores preferem usar a sintaxe + para a aritmtica de endereos (tambm chamada de aritmtica de
ponteiros). Observe que na forma mais concisa (e crptica), testamos *s e depois incrementamos s em *s++.
Apesar de crptica, esta ltima forma uma maneira fluente de falar C (entretanto, as 3 formas compilaro
para basicamente o mesmo cdigo com a mesma eficincia). Trata-se, muito mais, de uma questo de estilo.

int strlen(char * s) int strlen(char * s)


{ {
int n = 0; int n = 0; int strlen(char * s)
while (*s != '\0') while (*s) {
{ { int n = 0;
n++; n++; while (*s++)
s++; s++; n++;
} } return n;
return n; return n; }
} }

Ficaremos, neste curso, com a terceira forma.

1Por exemplo, em char a[4]; a o nome de um um array alocado estaticamente e em char * a = (int *)malloc(4); a um
ponteiro para um vetor alocado dinamicamente.

Você também pode gostar