Strings
Caracteres em C
Em C, caracteres são representados pelo tipo de dado char, e seus valores são definidos entre aspas simples. Por exemplo, 'A', '1', '?', '/', '\n', '\t' são todos caracteres válidos.
Exibir caracteres
Para exibir um caractere no terminal, você pode utilizar a função printf com a máscara %c. Veja um exemplo:
#include <stdio.h>
int main()
{
char c = 'A';
printf("Este é o caractere %c\n", c);
}Isso resultará na seguinte saída:
Este é o caractere A
Obter caracteres do usuário
Para obter um caractere que o usuário digita, você pode usar a função getchar(). Aqui está um exemplo:
#include <stdio.h>
int main()
{
puts("Digite qualquer letra: ");
char c = getchar();
printf("Você digitou %c\n", c);
}A função puts() é usada para exibir uma string sem formatação e adicionar uma quebra de linha.
Valores numéricos dos caracteres
Em C, cada caractere é associado a um valor numérico com base na tabela ASCII. Por exemplo, o caractere A é representado pelo inteiro 65, de acordo com a tabela ASCII. Isso permite que você realize operações numéricas com caracteres. Aqui está um exemplo:
#include <stdio.h>
int main()
{
char c = 'C';
printf("Este é o caractere %c\n", c);
printf("O valor inteiro deste caractere é %d\n", c);
}Isso resultará na seguinte saída:
Este é o caractere C
O valor inteiro deste caractere é 67
Manipulação e validação de Caracteres
A biblioteca ctype.h em C fornece funções para classificar caracteres e manipular caracteres. Abaixo, explicarei cada função dessa biblioteca:
Funções de classificação de caracteres (Character Classification):
-
isalnum:
- Verifica se um caractere é alfanumérico, ou seja, uma letra (maiúscula ou minúscula) ou um dígito.
- Retorna um valor diferente de zero se o caractere for alfanumérico, caso contrário, retorna zero.
-
isalpha:
- Verifica se um caractere é uma letra do alfabeto (maiúscula ou minúscula).
- Retorna um valor diferente de zero se o caractere for uma letra, caso contrário, retorna zero.
-
islower:
- Verifica se um caractere é uma letra minúscula.
- Retorna um valor diferente de zero se o caractere for minúsculo, caso contrário, retorna zero.
-
isupper:
- Verifica se um caractere é uma letra maiúscula.
- Retorna um valor diferente de zero se o caractere for maiúsculo, caso contrário, retorna zero.
-
isdigit:
- Verifica se um caractere é um dígito (0 a 9).
- Retorna um valor diferente de zero se o caractere for um dígito, caso contrário, retorna zero.
-
isxdigit:
- Verifica se um caractere é um dígito hexadecimal (0-9, A-F ou a-f).
- Retorna um valor diferente de zero se o caractere for um dígito hexadecimal, caso contrário, retorna zero.
-
iscntrl:
- Verifica se um caractere é um caractere de controle (por exemplo, caracteres não imprimíveis).
- Retorna um valor diferente de zero se o caractere for um caractere de controle, caso contrário, retorna zero.
-
isgraph:
- Verifica se um caractere é um caractere gráfico (um caractere que tem representação gráfica na tela).
- Retorna um valor diferente de zero se o caractere for gráfico, caso contrário, retorna zero.
-
isspace:
- Verifica se um caractere é um caractere de espaço (por exemplo, espaço em branco, tabulação, quebra de linha).
- Retorna um valor diferente de zero se o caractere for um caractere de espaço, caso contrário, retorna zero.
-
isblank (C99):
- Verifica se um caractere é um caractere de espaço em branco (espaço ou tabulação).
- Retorna um valor diferente de zero se o caractere for espaço em branco, caso contrário, retorna zero.
-
isprint:
- Verifica se um caractere é um caractere imprimível (um caractere que pode ser exibido na tela).
- Retorna um valor diferente de zero se o caractere for imprimível, caso contrário, retorna zero.
-
ispunct:
- Verifica se um caractere é um caractere de pontuação (por exemplo, vírgula, ponto e vírgula).
- Retorna um valor diferente de zero se o caractere for um caractere de pontuação, caso contrário, retorna zero.
Funções de manipulação de caracteres (Character Manipulation):
-
tolower:
- Converte um caractere em minúscula, se possível.
- Retorna o caractere convertido se for uma letra maiúscula, caso contrário, retorna o mesmo caractere.
-
toupper:
- Converte um caractere em maiúscula, se possível.
- Retorna o caractere convertido se for uma letra minúscula, caso contrário, retorna o mesmo caractere.
Essas funções são úteis para verificar e transformar caracteres em operações de processamento de texto e entrada/saída. Por exemplo, você pode usá-las para validar entradas do usuário, manipular texto em caixa alta ou baixa, e muito mais, tornando-as ferramentas essenciais na manipulação de caracteres em programas C.
Exibir strings sem formatação
Você também pode exibir strings sem formatação usando a função fputs(). Por exemplo:
#include <stdio.h>
int main()
{
fputs("Digite um número: ", stdout);
char c = getchar();
if (isdigit(c))
{
printf("Você digitou o número %c\n", c);
}
else
{
printf("%c não é um número!\n", c);
}
}Isso produzirá a seguinte saída:
Digite um número: 5
Você digitou o número 5
Caracteres em C são fundamentais para lidar com entrada, saída e processamento de dados, e compreender seu funcionamento é essencial para programação em C. Se você tiver mais dúvidas ou precisar de esclarecimentos adicionais, sinta-se à vontade para perguntar.
Strings
Em C, uma string é um conjunto de caracteres tratado como uma única entidade. Por exemplo, "Rua do Engenho, 123", "1000", "(11) 9999-8888", "23/11/1955" são todos exemplos de strings.
Representação de Strings
Na linguagem C, os valores das strings são representados entre aspas duplas, como "Exemplo de string".
É importante destacar que em C, não existe um tipo de dado específico para strings como em algumas outras linguagens. Em vez disso, uma string é representada como um array de caracteres. Para indicar o final de uma string, utiliza-se o caractere especial \0, que é chamado de null character. Por exemplo:
#include <stdio.h>
int main()
{
char palavra[20];
palavra[0] = 'L';
palavra[1] = 'e';
palavra[2] = 'g';
palavra[3] = 'a';
palavra[4] = 'l';
palavra[5] = '\0';
printf("Palavra: %s\n", palavra);
}Nesse exemplo, estamos criando uma string “Legal” e usando o caractere \0 para indicar o seu final. A máscara %s é usada na função printf para formatar e exibir a string.
Inicialização de Strings
Existem duas formas comuns de inicializar strings em C:
-
Utilização da notação de array:
char nome[] = {'M', 'a', 'r', 'i', 'a', '\0'}; -
Valor literal:
char nome[] = "Maria";
A segunda forma é mais simples e amplamente usada, onde a string é inicializada com um valor literal entre as aspas duplas.
Leitura de Strings
A leitura de strings em C pode ser feita com o auxílio da função scanf(), mas essa função lê os caracteres até encontrar o primeiro espaço em branco. Isso significa que ela lê apenas uma palavra por chamada. Aqui está um exemplo:
#include <stdio.h>
int main()
{
char nome[11];
fputs("Digite um nome com 10 letras: ", stdout);
scanf("%s", nome);
printf("Nome digitado: %s\n", nome);
}Se você inserir “Ana Maria”, a saída será:
Digite um nome com 10 letras: Ana Maria
Nome digitado: Ana
Para resolver esse problema e ler strings com espaços, você pode chamar a função scanf() novamente ou melhor usar a função fgets():
#include <stdio.h>
int main()
{
char nome[11];
char sobrenome[11];
fputs("Digite seu nome e sobrenome: ", stdout);
scanf("%s", nome);
scanf("%s", sobrenome);
printf("Nome: %s\n", nome);
printf("Sobrenome: %s\n", sobrenome);
}Alternativamente, podemos usar fgets() para ler a linha inteira, incluindo espaços em branco:
#include <stdio.h>
int main()
{
char nome[50]; // Aumentamos o tamanho para acomodar nomes maiores
fputs("Digite seu nome completo: ", stdout);
fgets(nome, sizeof(nome), stdin);
printf("Nome completo: %s\n", nome);
}A função fgets() lê uma linha inteira (até que o usuário pressione Enter) e armazena na variável nome. O terceiro parâmetro stdin indica a entrada padrão (teclado).
Biblioteca string.h para Manipulação de Strings
A biblioteca string.h em C fornece várias funções para manipulação de strings. Aqui estão algumas das funções mais comuns e suas descrições:
Conversões para e a partir de formatos numéricos:
-
atof:
- Converte uma sequência de bytes em uma representação de ponto flutuante (número decimal de ponto flutuante).
- Retorna o valor convertido como um número de ponto flutuante (
float).
-
atoi, atol, atoll (C99):
- Convertem uma sequência de bytes em um valor inteiro (número inteiro).
atoiretorna um valorint.atolretorna um valorlong.atollretorna um valorlong long.
-
strtol, strtoll (C99):
- Convertem uma sequência de bytes em um valor inteiro (número inteiro), permitindo controle avançado de base (decimal, hexadecimal, octal, etc.).
strtolretorna um valorlong.strtollretorna um valorlong long.
-
strtoul, strtoull (C99):
- Convertem uma sequência de bytes em um valor inteiro não assinado (número inteiro sem sinal), permitindo controle avançado de base.
strtoulretorna um valorunsigned long.strtoullretorna um valorunsigned long long.
-
strtof, strtod, strtold (C99):
- Convertem uma sequência de bytes em um valor de ponto flutuante (número decimal de ponto flutuante), permitindo controle avançado de precisão.
strtofretorna um valorfloat.strtodretorna um valordouble.strtoldretorna um valorlong double.
-
strfromf, strfromd, strfromld (C23):
- Convertem um valor de ponto flutuante em uma sequência de bytes.
- Essas funções são usadas para converter números de ponto flutuante em strings.
Manipulação de strings:
-
strcpy, strcpy_s (C11):
- Copiam uma string para outra.
strcpynão verifica os limites e pode causar estouro de buffer.strcpy_sé uma versão segura que permite especificar o tamanho máximo do buffer de destino.
-
strncpy, strncpy_s (C11):
- Copiam uma quantidade específica de caracteres de uma string para outra.
strncpycopia um número especificado de caracteres e preenche com nulos se a origem for mais curta.strncpy_sé uma versão segura que permite especificar o tamanho máximo do buffer de destino.
-
strcat, strcat_s (C11):
- Concatenam duas strings (anexam uma no final da outra).
strcatnão verifica os limites e pode causar estouro de buffer.strcat_sé uma versão segura que permite especificar o tamanho máximo do buffer de destino.
-
strncat, strncat_s (C11):
- Concatenam uma quantidade específica de caracteres de duas strings.
strncatanexa um número especificado de caracteres e adiciona um nulo no final.strncat_sé uma versão segura que permite especificar o tamanho máximo do buffer de destino.
-
strxfrm:
- Transforma uma string de forma que
strcmpproduza o mesmo resultado questrcoll. - É usado para fazer comparações de strings sensíveis ao idioma.
- Transforma uma string de forma que
-
strdup (C23):
- Aloca e cria uma cópia de uma string existente.
- Essencialmente, duplica uma string.
-
strndup (C23):
- Aloca e cria uma cópia de uma string existente com um tamanho máximo especificado.
Exame de strings:
-
strlen, strnlen_s (C11):
- Retorna o comprimento de uma string (número de caracteres).
strlennão verifica os limites do buffer.strnlen_sé uma versão segura que permite especificar o tamanho máximo.
-
strcmp:
- Compara duas strings e retorna um valor inteiro que indica se são iguais ou qual é maior.
-
strncmp:
- Compara uma quantidade específica de caracteres de duas strings.
-
strcoll:
- Compara duas strings de acordo com as regras de classificação da localidade atual (idioma e região).
-
strchr:
- Encontra a primeira ocorrência de um caractere em uma string.
-
strrchr:
- Encontra a última ocorrência de um caractere em uma string.
-
strspn:
- Retorna o comprimento do segmento inicial máximo que consiste apenas nos caracteres encontrados em outra string.
-
strcspn:
- Retorna o comprimento do segmento inicial máximo que consiste apenas nos caracteres que não são encontrados em outra string.
-
strpbrk:
- Encontra a primeira localização de qualquer caractere de uma string em outra string.
-
strstr:
- Encontra a primeira ocorr