Programar em C/Strings

Origem: Wikilivros, livros abertos por um mundo aberto.


Esta página é um esboço de informática. Ampliando-a você ajudará a melhorar o Wikilivros.


Strings[editar | editar código-fonte]

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:

char nome[] = {'P', 'e', 'd', 'r', 'o', '\0'};

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:

char nome[] = "Pedro";

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:

char nome[] = "João";

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[editar | editar código-fonte]

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[editar | editar código-fonte]

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:

char nome[15] = "Maria da Silva";
int s = strlen (nome);
// s conterá o valor 14

strcpy[editar | editar código-fonte]

strcpy copia o conteúdo de uma string para outra e coloca um terminador de string. Sua sintaxe é strcpy (destino, origem).

char nome[]  = "Clarice Lispector";
char nome2[] = "Oswald de Andrade";
strcpy (nome, nome2);
// agora nome conterá "Oswald de Andrade"

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:

char msg[] = "Bom dia!";
char nome[] = "Maria da Silva";
strncpy (msg, nome, strlen(msg));
// agora msg conterá "Maria da"

strcat[editar | editar código-fonte]

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:

char nome[50] = "Maria";
char sobrenome[] = " da Silva";
strcat (nome, sobrenome);
// agora nome contém "Maria da Silva"

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[editar | editar código-fonte]

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):

int strcmp (char *s1, char *s2);

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[editar | editar código-fonte]

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:

char path[50] = "/teste/string";
char *p = strrchr(path, '/');
*p++;
printf("Resultado: %s \n", p );

memcpy[editar | editar código-fonte]

Sintaxe:

 
   #include <string.h>

    void *memcpy (void *dest, const void *srce, size_t n);

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:

#include <stdio.h>
#include <string.h>

int main() {
    int tab[2][5] = { { 1, 2, 3, 4, 5},
                      {11, 12, 13, 14, 15} };
    int temp[2][5];

    memcpy(temp, tab, sizeof(tab));
    puts("Resultado:\n");
    printf("temp[1][4] = %d\n", temp[1][4]);
    return 0;
}

memset[editar | editar código-fonte]

Sintaxe:

 
  #include <string.h>

    void *memset (void *buffer, int c, size_t n);

Descrição: memset inicializa n octetos do buffer com o inteiro c.

Valor de retorno  : O valor do buffer.

Ex:

#include <stdio.h>
#include <string.h>

int main() {
    char buf[] = "W.I.K.I.";

    printf("Buf antes 'memset': %s\n", buf);
    memset(buf, '*', strlen(buf));
    printf("Buf depois 'memset': %s\n", buf);
    return 0;
}

sprintf[editar | editar código-fonte]

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:

 
 #include <stdio.h>

    int sprintf(char *s, const char *formato, ...);

Ex:

    #include <stdio.h>  
    #include <string.h>  
      
    int main() {  
        char var[256];  
        char sobrenome[] = "Simpson";  
        char nome[] = "Homer";  
      
        int idade = 30;  
      
        sprintf(var, "%s %s tem %d anos",sobrenome, nome, idade);  
      
        printf ("Resultado : %s\n", var);  
      
        return 0;  
    }

strcoll[editar | editar código-fonte]

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:

#include <studio.h>
#include <string.h>

int main(){
  char stringA[] = "Computacao";
  char stringB[] = "Computador";
  printf("String A: %s\n", stringA);
  printf("String B: %s\n", stringB);
  printf("Valor da primeira comparação: %d\n\n", strcoll(stringA, stringB));
  
  char stringC[] = "BCC";
  char stringD[] = "BCC";
  printf("String C: %s\n", stringC);
  printf("String D: %s\n", stringD);
  printf("Valor da segunda comparação: %d\n\n", strcoll(stringC, stringD));
    
  return 0;
}

Saída do Terminal:

 >./main
      String A: Computacao
      String B: Computador
      Valor da primeira comparação: -1
      
      String C: BCC
      String D: BCC
      Valor da segunda comparação: 0