CCT-UFCA/Ciência da Computação/Introdução à Programação/Manipulando Cadeia de Caracteres
Manipulando Cadeia de Caracteres
[editar | editar código]Em C, uma cadeia de caracteres (ou string) é, na verdade, uma sequência de valores do tipo char, que termina obrigatoriamente com o caractere especial '\0' (nulo). Esse caractere indica ao compilador onde a string se encerra. Sem ele, o programa não consegue identificar corretamente o fim da sequência, o que pode gerar comportamentos inesperados, como leitura de lixo na memória ou até erros de execução.
Declaração de Strings
[editar | editar código]Para trabalhar com uma string em C, declaramos um vetor do tipo char, especificando quantos caracteres ela poderá armazenar. Por exemplo:
char nome[20];
Aqui, o vetor nome pode receber até 19 caracteres úteis, pois o último espaço será ocupado automaticamente pelo caractere nulo (\0). Também é possível inicializar diretamente:
char saudacao[] = "Olá Mundo!";
Nesse caso, o compilador conta automaticamente o tamanho necessário para armazenar os caracteres 'O', 'l', 'á', ' ', 'M', 'u', 'n', 'd', 'o', '!' e o caractere nulo '\0', resultando em um vetor de tamanho 11.
Importante: sempre que criamos uma string com aspas duplas ("Texto"), o compilador automaticamente adiciona o '\0' no final.
Diferença entre array de caracteres e string
[editar | editar código]Tecnicamente, em C, uma string é um array de caracteres terminado em \0. Portanto, nem todo array de char é necessariamente uma string, a não ser que esteja corretamente terminado com o caractere nulo. Se esquecer de garantir isso, funções que trabalham com strings podem acessar áreas inválidas de memória.
Entrada e saída de strings
[editar | editar código]Usando scanf
[editar | editar código]O scanf permite ler strings, mas possui uma limitação importante: ele interrompe a leitura quando encontra o primeiro espaço, tabulação ou quebra de linha.
Exemplo:
char nome[20];
scanf("%s", nome);
Essa é uma alternativa para realizar a leitura de strings considerando espaços em branco. No entanto, não é um formato de leitura muito adequado para ser usado.
char nome[20];
scanf("%[^\n]s", nome);
Usando fgets
[editar | editar código]A função fgets é mais segura para ler strings, pois permite capturar uma linha inteira, incluindo espaços.
Exemplo:
char nome[20];
fgets(nome, 20, stdin);
Por padrão, fgets armazena também o caractere de quebra de linha (\n) quando há espaço no buffer.
- str: Ponteiro para o buffer de caracteres onde a string lida será armazenada.
- n: Número máximo de caracteres a serem lidos, incluindo o caractere nulo final (\0).
- stream: Ponteiro para o fluxo de entrada, que pode ser um arquivo aberto ou stdin (entrada padrão).
Saída com printf
[editar | editar código]Imprimir uma string é simples:
printf("Seu nome é: %s\n", nome);
Como visto em Introdução à Programação/Entrada e Saída, o especificador %s indica que será impressa uma string.
Operações comuns com strings
[editar | editar código]A linguagem C oferece, através da biblioteca padrão <string.h>, diversas funções para manipular strings. Essas funções são fundamentais, pois C não tem operadores nativos (como + para concatenar) que funcionem diretamente com strings.
Principais operações:
Verificar o tamanho - strlen()
[editar | editar código]Retorna o número de caracteres da string, sem contar o caractere nulo.
Exemplo:
int tamanho = strlen(nome);
printf("Tamanho: %d\n", tamanho);
Copiar uma string - strcpy()
[editar | editar código]Copia uma string para outra. O destino deve ter espaço suficiente para armazenar o conteúdo.
Exemplo:
char string_copia[50];
strcpy(string_copia, string_real);
⚠️ Atenção: strcpy não faz verificação de limite. Se a string de origem for maior que o espaço disponível no destino, ocorre estouro de buffer, podendo causar falhas no programa. Por isso, uma alternativa mais segura é strncpy():
strncpy(string_copia, string_real, sizeof(string_copia) - 1);
string_copia[sizeof(string_copia) - 1] = '\0';
A segunda linha garante que o último caractere será o fim da string com '\0'.
Concatenar strings - strcat()
[editar | editar código]Adiciona o conteúdo de uma string ao final de outra.
Exemplo:
char saudacao[50] = "Olá, ";
strcat(saudacao, nome);
printf("%s\n", saudacao);
Comparar strings - strcmp()
[editar | editar código]Permite comparar duas strings caractere a caractere. Intuitivamente pensamos em fazer assim como fazemos com inteiros, comparar strings com ==, no entanto, isso não faz a comparação entre os caracteres das duas strings. A comparação correta entre strings em C pode ser feita da seguinte forma:
if (strcmp(nome, "Marcos") == 0) {
printf("Nome correto!\n");
} else {
printf("Nome diferente.\n");
}
O retorno de strcmp é:
- 0: strings são iguais
- < 0: a primeira string é lexicograficamente menor
- > 0: a primeira string é maior
Procurar um caractere - strchr()
[editar | editar código]Busca a primeira ocorrência de um caractere dentro da string.
Exemplo:
char *ptr = strchr(nome, 'a');
if (ptr != NULL) {
printf("Encontrou o 'a' na posição: %ld\n", ptr - nome);
}
Procurar uma substring - strstr()
[editar | editar código]Procura uma string dentro de outra.
Exemplo:
char *ptr = strstr(nome, "Silva");
if (ptr != NULL) {
printf("Sobrenome encontrado.\n");
}
Conclusão
[editar | editar código]Trabalhar com strings em C é um exercício essencial para entender como a linguagem lida com memória, ponteiros e estruturas de dados mais primitivas. Diferente de linguagens de alto nível, C obriga o programador a pensar no tamanho dos dados, na terminação das strings e na correta manipulação de arrays. Apesar de ser mais trabalhoso, esse controle também permite criar programas mais performáticos e eficientes.