next up previous contents
Next: Estruturas Up: Tipos agregados e derivados Previous: Arranjos   Sumário


Strings

Um dos tipos de arranjos que mais ocorre em C é o arranjo de caracteres, ou string. C não suporta um tipo básico string; ao invés, há uma convenção para tratamento de arranjos de caracteres que permite o uso de diversas funções de manipulação de strings na linguagem.

Por convenção, C considera como uma string uma seqüência de caracteres armazenada sob a forma de um arranjo de tipo char cujo último elemento é o caráter NUL, tipicamente representado na forma de caráter, '\0', ou simplesmente pelo seu valor, 0. Por exemplo, um string poderia ser declarado e inicializado como em

      char exemplo[4] = {'a','b','c','\0'};

Observe que o espaço para o caráter '\0' deve ser previsto quando dimensionando o tamanho do arranjo de caracteres que será manipulado como string. No exemplo, o arranjo de quatro caracteres pode receber apenas três letras, já que o último caráter está reservado para o NUL.

C suporta uma forma alternativa de representação de um string constante, que é através do uso de aspas:

      char exemplo[4] = "abc";

Este exemplo é equivalente ao anterior -- a string "abc" contém quatro caracteres, sendo que o caráter '\0' é automaticamente anexado à string pelo compilador.

Funções que manipulam strings trabalham usualmente com a referência para o início da seqüência de caracteres, ou seja, com um ponteiro para a string. A manipulação de ponteiros é fonte usual de confusão em qualquer linguagem. Por exemplo, tendo duas variáveis ponteiros char* s1 e char* s2 indicando o início de duas strings, não seria possível copiar o conteúdo de s2 para s1 simplesmente por atribuição,

    s1 = s2;        /* copia o endereco! */
ou comparar seus conteúdos diretamente,
    if (s1 != s2)   /* compara os enderecos! */
       ...

Diversas rotinas são suportadas para manipular strings na biblioteca padrão de C, tais como:

    char  *strcat(char *s1, const char *s2);
    char  *strncat(char *s1, const char *s2, size_t n);
    int    strcmp(const char *s1, const char *s2);
    int    strncmp(const char *s1, const char *s2, size_t n);
    char  *strcpy(char *s1, const char *s2);
    char  *strncpy(char *s1, const char *s2, size_t n);
    size_t strlen(const char *s);
    char  *strchr(const char *s, int c);
Os protótipos para essas rotinas estão definidos no arquivo de cabeçalho string.h. Nesses protótipos, size_t é um nome de tipo (ver Seção C.2.6) para representar tamanhos correspondentes a algum tipo inteiro definido no arquivo de cabeçalho stddef.h.

A função strcat concatena a string apontada por s2 à string apontada por s1. O arranjo associado ao endereço s1 deve ter espaço suficiente para armazenar o resultado concatenado. A função strncat permite limitar a quantidade de caracteres concatenados, agregando no máximo n caracteres de s2 a s1.

A função strcmp compara o conteúdo de duas strings. Se a string apontada por s1 for igual àquela de s2, o valor de retorno da função é 0. Se forem diferentes, o valor de retorno será negativo quando a string em s1 for lexicograficamente menor que aquela de s2, ou positivo caso contrário. A função strncmp compara no máximo até n caracteres das duas strings.

A função strcpy copia a string em s2 (até a ocorrência do caráter '\0') para o arranjo apontado por s1. A função strncpy copia no máximo até n caracteres. Observe que neste caso, se a string em s2 for maior que n caracteres, a string resultante não será terminada pelo caráter '\0'.

A função strlen retorna o comprimento da string em s, sem incluir nessa contagem o caráter '\0'.

A função strchr retorna o apontador para a primeira ocorrência do caráter c na string em s, ou o apontador nulo se o caráter não está presente na string.

Além destas funções, é interessante destacar que existe uma função sprintf (declarada em stdio.h e parte da biblioteca padrão) que permite formatar valores seguindo o mesmo padrão utilizado em printf, com a diferença que a saída formatada é colocada em uma string ao invés de ser enviada para a tela. Seu protótipo é:

    int sprintf (char *s, const char *format, ...);
É responsabilidade do programador garantir que o arranjo para a string apontado por s tenha espaço suficiente para armazenar o resultado.


next up previous contents
Next: Estruturas Up: Tipos agregados e derivados Previous: Arranjos   Sumário
Ivan L. M. Ricarte 2003-02-14