Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

A biblioteca string.h e suas funções

Trabalhar com strings, em C, não é nada óbvio, precisamos treinar bastante até ter total controle dos caracteres de nosso texto.

Essa dificuldade se torna ainda maior se você já tiver estudado outra linguagem de programação, como Java, Perl ou Python, onde a manipulação de texto é extremamente óbvia e simples.
Mas essa simplicidade toda não vem de graça, requer custos: processamento e memória de um computador.

Vamos agora, em nossa apostila de C, apresentar as principais funções para manipulação de strings, como usá-las e melhor: como criá-las! Sim, vamos criar funções de manipulação de strings para você saber como tudo funciona em C e como exercícios.

A biblioteca string.h e suas funções: quais existem, para quê servem e como usá-las

Vamos agora mostrar as funções da biblioteca string.h e o que cada uma faz.
Embora essas funções já existam e sejam testadas milhões de vezes a cada instante, vamos refazê-las.

“Mas para quê inventar algo que já existe?”
Simples: para aprender como funciona.
Você só aprende algo de verdade, quando faz a coisa. Só ver ou decorar como faz, não serve de absolutamente nada.

Você pode muito bem ler aqui as funções que existem, para quê servem e como usá-las.
Mas se quer realmente aprender a trabalhar com vetores, ponteiros e strings, sugerimos que tente fazer funções e colocar em sua biblioteca mystring.h
É isso o que vamos fazer nos próximos tutoriais.

Segue a lista das funções da biblioteca string.h cuja fonte é a Wikipedia:


Funções de exame de strings:

  • strlen: size_t strlen( const char *str );

Essa função recebe um ponteiro que indica uma string e retorna quantos caracteres essa string possui.

  • strcmp: int strcmp( const char *lhs, const char *rhs );

Essa função compara duas strings segundo sua ordem alfabética e retorna um inteiro.
Se esse inteiro for negativo, é porque a primeira string é menor que a segunda.
Se retornar um inteiro positivo, é porque a segunda string é maior que a segunda.
Se retornar 0, é porque as strings são idênticas.

  • strncmp: int strncmp( const char *lhs, const char *rhs, size_t count );

Faz a mesma comparação da strcmp, mas ao invés de comparar toda a string, compara somente os 'count' primeiros caracteres.

  • strchr: char *strchr( const char *str, int ch );

Retorna um ponteiro para a localização em que o caractere 'ch' aparece na string pela primeira vez na string apontada por *str, ou NULL se não encontrar.

  • strrchr: char *strrchr( const char *str, int ch );

Faz a mesma coisa da função anterior, mas ao invés de localizar a primeira ocorrência de 'ch', localiza e retorna a última ocorrência.

  • strspn: size_t strspn( const char *dest, const char *src );

Retorna o tamanho máximo do primeiro segmento na string 'dest' que consiste de elementos da string 'src'.

  • strcspn: size_t strcspn( const char *dest, const char *src );

É o contrário da anterior, ou seja, retorna o tamanho máximo do segmento inicial na string 'dest' que consiste somente de elementos que NÃO ESTÃO na string 'src'.

  • strpbrk: char* strpbrk( const char* dest, const char* str );

Retorna o primeiro caractere que está em ambas strings recebidas, ou NULL se não existe caractere comum.

  • strstr: char *strstr( const char* str, const char* substr );

Retorna um ponteiro que indica a primeira ocorrencia da string 'substr' na string 'str'.





Funções de manipulação de strings

  • strcpy: char *strcpy( char *dest, const char *src );

Copia a string 'src' para a string 'dest', e retorna um ponteiro para 'dest'.

  • strncpy: char *strncpy( char *dest, const char *src, size_t count );

Faz a mesma coisa da strcpy, mas em vez de copiar todos os elementos, copia somente os 'count' primeiros elementos da 'src' para a 'dest'.

  • strcat: char *strcat( char *dest, const char *src );

Copia (concatena) a string 'src' ao final da string 'dest'.

  • strncat: char *strncat( char *dest, const char *src, size_t count );

Copia (concatena) 'count' elementos da string 'src' no final da string 'dest'.


  • memset: void* memset( void* dest, int ch, size_t count );

Coloca o caractere 'ch' nas 'count' primeiras posições da string 'dest'.

  • memcpy: void* memcpy( void* dest, const void* src, size_t count );

Copia os 'count' primeiros caracteres da string 'src' e coloca nas primeiras 'count' da string 'dest'.

  • memcmp: int memcmp( const void* lhs, const void* rhs, size_t count );

Compara os 'count' primeiros caracteres das strings.
Retorna negativo se os 'count' primeiros caracteres da primeira string forem menor que a segunda.
Retorna positivo se os 'count' primeiros caracteres da primeira string forem maior que a segunda.
Retorna 0 se os 'count' primeiros caracteres das duas strings são iguais.

  • memchr: void* memchr( const void* ptr, int ch, size_t count );

Acha a primeira ocorrência do caractere 'ch' nos primeiras 'count' elementos da string 'ptr' e devolve o endereço da ocorrência ou NULL.

4 comentários:

Anônimo disse...

Tenho uma duvida nao sei se pertence a esse topico, estou fazendo um programa que simula um jogo de dados, temos 2 dados somamos eles e o utilizador tem de adivinhar o resultado da soma, ja tenho todo feito mas tbm queria colocar nele para que toda a vez que o utilizador usar letras onde é suposto usar numeros aparecer uma mensagem de erro que ele nao pode fazer isso

Apostila C Progressivo disse...

Anônimo,

Na biblioteca ctype.h tem uma função chamada isdigit(), que recebe um caractere.

Ele retorna 0 se esse caractere NÃO for um número (um dígito), e retorna outro número (verdadeiro) caso seja um dígito decimal.

Ou seja, tu pede o resultado da soma pro usuário, armazena e testar com um IF se é um número mesmo, através da função isdigit().

Anônimo disse...

tenho uma dúvida, estou desenvolvendo um programa, onde preciso saber se um string "10 20" é um subconjunto de outra string por exemplo "10 15 20", existe uma função em c que consiga verificar isto, ou preciso separa-los antes de verificar, desde já agradeço.

Biqueri disse...

Gente uma duvida

Preciso de um programa que epgue um numero em hexadecimal em C e transforme ele no seu caractere correspondente CHAR, alguem pode me dizer que programa de que biblioteca pode me ajudar e como fazer isso?