# Programar em C/Strings
## Strings

Strings (Inglês) são cadeias ou seqüências ordenadas de caracteres. Na verdade já trabalhamos com strings neste livro, mas preferimos deixar maiores explicações para um momento em que já tivesse sido introduzido o conceito de vetor.
A linguagem C, ao contrário de outras linguagens de programação, não possui um tipo de dados correspondente às strings; no lugar, usam-se vetores (e ponteiros, como veremos mais adiante). Em C, strings são vetores de caracteres terminados pelo caractere nulo ('\0'). Por exemplo:
No entanto, escrever strings dessa maneira é muito trabalhoso; por isso, foi criada uma notação abreviada que equivale à notação acima e elimina a necessidade de colocar o caractere terminador:
Assim como nos vetores, podemos acessar e modificar elementos individuais de uma string. Podemos também diminuir o tamanho de uma string: uma vez que a única marcação do tamanho é o terminador \0, colocar um terminador em outro local determinará o novo final da string. No entanto, aumentar o tamanho da string é mais difícil; isso ficará para outra seção.
Atenção ao usar-se acentos numa string. Como existem diferentes formas de codificar caracteres acentuados, o tratamento de uma string do tipo:
pode ser diferente de uma máquina para outra. Neste capítulo não serão tratados acentos, este assunto será abordado mais adiante.

## Funções da biblioteca padrão

A biblioteca padrão fornece várias funções úteis para manipular strings. A seguir mostraremos algumas delas. Para usá-las, você deve incluir o cabeçalho string.h no início dos seus arquivos.

### strlen

strlen retorna o tamanho, em caracteres, de uma string dada. Na verdade o strlen procura o terminador de string e calcula a distância dele ao início da string. Por exemplo:

### strcpy

strcpy copia o conteúdo de uma string para outra e coloca um terminador de string. Sua sintaxe é strcpy (destino, origem).
Tome cuidado com strcpy, pois se a string a ser copiada for maior que a string de destino, provavelmente você gravará dados em lugares indesejados ― um problema conhecido como estouro de buffer. Para evitar esse problema, use a função strncpy, que recebe um terceiro argumento que corresponde ao número máximo de caracteres a serem copiados:

### strcat

strcat concatena duas strings, adicionando o conteúdo da segunda ao final da primeira, além do terminador (\0). Note que a primeira string deve ter espaço suficiente para conter a segunda, para que não ocorra um "estouro de buffer". Por exemplo:
Analogamente à função strncpy, existe também a função strncat, onde o número máximo de caracteres a serem copiados é o terceiro argumento.

### strcmp

Se você tentar criar duas strings com o mesmo conteúdo e compará-las como faria como números, verá que elas "não são iguais". Isso ocorre porque, na verdade, o que está sendo comparado são os endereços de memória onde estão guardadas as strings. Para comparar o conteúdo de duas strings, você deve usar a função strcmp (ou suas variantes):
O valor de retorno é:
* menor que zero se s1 for menor que s2;
* igual a zero se s1 e s2 são iguais;
* maior que zero se s1 for maior que s2.
Costuma parecer estranho dizer que uma string é menor ou maior que outra; na verdade essa comparação é entre a primeira letra que difere nas duas strings. Assim, se tivermos s1 = "abc" e s2 = "abd", diremos que s2 é maior que s1, pois na primeira posição em que as duas strings diferem, a letra em s2 é "maior".
É importante notar que a comparação feita por strcmp distingue maiúsculas de minúsculas. Isto é, as strings "ABC" e "abc" não são iguais para essa função.
As variantes mais usadas de strcmp são:
* strncmp - compara apenas os n primeiros caracteres das duas strings, sendo n um terceiro argumento.
* stricmp - compara duas strings sem distinção entre maiúsculas e minúsculas. A sintaxe é igual à de strcmp. Essa função não faz parte da biblioteca padrão, mas é comumente encontrada como extensão particular de várias delas.

### strrchr

strrchr Retorna um ponteiro sobre a última ocorrência de c de uma string apontada por s se não retorna NULL . Sua sintaxe é strrchr(const char *s, int c);. Exemplo:

### memcpy

Sintaxe:
Descrição: Copiar um bloco de n octetos de srce para dest.
Atenção:Se as regiões de srce e dest se sobreporem o comportamento da função é imprevisível.
Valor de retorno : memcpy retorna o valor de dest .
Ex:

### memset

Sintaxe:
Descrição: memset inicializa n octetos do buffer com o inteiro c.
Valor de retorno : O valor do buffer.
Ex:

### sprintf

Descrição: A diferença entre printf e sprintf e que printf retorna o resultado para a saída padrão (tela), enquanto sprintf retorna o resultado em uma variável. Isto é muito conveniente, porque você pode simplesmente digitar a frase que você quer ter e sprintf lida com a própria conversão e coloca o resultado na string que você deseja.
Sintaxe:
Ex:

### strcoll

Descrição Uma string de comparação A, uma string de comparação B. Retorna um valor após a comparação caractere-a-caractere das duas strings com base no LC_COLLATE. De forma detalhada, a função compara o primeiro caractere da stringA com o primeiro caractere da stringB. Caso sejam iguais, ele parte para o segundo caractere. Isso se repete até que ocorra uma divergência ou quando o caractere terminal é encontrado em qualquer uma das strings.
Exemplo de uso da função:
Saída do Terminal: