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.