Strings em C
Em C, uma string é uma sequência de caracteres terminada pelo caractere nulo '\0'. Elas podem ser representadas como constantes literais, arrays de caracteres ou ponteiros para caracteres.
Declaração de Strings
Constantes de string são literais entre aspas duplas. O compilador insere automaticamente o terminador '\0'. Exemplo:
char minhaStr[] = "aa" "bb" "cc"; // Equivale a "aabbcc"
Essas constantes residem em regiões de memória estáticas.
Arrays de Caracteres
Ao definir um array para uma string, o tamanho deve acomodar o '\0'. Se o tamanho não for especificado, o terminador deve ser incluído explicitamente:
char saudacao[40] = "Olá, mundo!"; // Espaço para '\0' implícito
char manual[] = {'x', 'y', '\0'}; // Terminador explícito necessário
Sem o '\0', o array não é tratado como string completa.
Ponteiros para Caracteres
Strings podem ser apontadas por ponteiros:
char *mensagem = "Teste"; // Armazenada em memória constante
Tentativas de modificação direta como *(mensagem+0) = 't'; causam erro, pois a string literal é imutável.
Diferença entre arrays e ponteiros: nomes de arrays são endereços constantes (não incrementáveis com ++), enquanto ponteiros são variáveis (permitem ++mensagem).
Funções de String do <string.h>
A biblioteca padrão oferece funções seguras e comuns para manipulação. Versões seguras (sufixo _s) adicionam parâmetros de tamanho.
Cópia e Concatenação
char destino[25];
strcpy_s(destino, sizeof(destino), "origem"); // Cópia completa
strncpy_s(destino, sizeof(destino), "origem", 3); // Copia até 3 caracteres
Concatenação controlada:
char buffer[50] = "Início";
strcat_s(buffer, sizeof(buffer), " Fim"); // Anexa limitando tamanho total
strncat_s permite especificar quantos caracteres anexar.
Comprimento e Comparação
int len = strlen(texto); // Assume '\0' no final
int len_seguro = strnlen(texto, 10); // Limita busca a 10 posições
Comparação lexicográfica:
int cmp = strcmp(a, b); // 0 se iguais, negativo/positivo caso contrário
int cmp_parcial = strncmp(a, b, 4); // Compara primeiros 4 caracteres
Busca em Strings
Localizar caracteres ou substrings:
char *ptr_char = strchr(texto, 'a'); // Primeira ocorrência
char *ptr_sub = strstr(texto, "abc"); // Substring
strpbrk busca qualquer caractere de um conjunto:
char *intersecao = strpbrk(str1, "xyz");
Análise de preifxos com conjuntos de caracteres:
int prefixo_aceito = strspn(str1, "aeiou"); // Tamanho do prefixo de vogais
int prefixo_invalido = strcspn(str1, "aeiou"); // Posição da primeira vogal
Funções de Conversão do <stdlib.h>
Conversões de string para tipos numéricos:
char *final;
double val_double = strtod(" -3.14xyz", &final); // Ignora espaços iniciais
strtol suporta bases de 2 a 36 (base 0 auto-detecta):
char *restante;
long val_long = strtol("0101", &restante, 2); // Base binária
Funções simples como atoi convertem sem detalhes de parada:
int val_int = atoi("12345");