Aula 17: strings (cadeias de caracteres)

Traduzido por Ana Paula Costa

 
 

string

 Uma string é um array de char

Vamos ver as implicações desta simples definição.



Para exemplificar: declarando uma string de 100 caracteres:
  char n[100];

Ingenuamente poderíamos pensar que atribuir um valor a esta variável poderia ser feito com
  n = "Benfica";
mas não podemos esquecer que n é um ponteiro para char (ver aula 15) e o lado direito do = não é (é uma constante do tipo string). A forma de se fazer a atribuição seria atribuir um valor a cada elemento do array:
  n[0] = 'B';
  n[1] = 'e';
  n[2] = 'n';
  n[3] = 'f';
  n[4] = 'i';
  n[5] = 'c';
  n[6] = 'a';
  n[7] = '\0';
Do lado esquerdo de cada = está um elemento do array (char) e do lado direito está uma constante do tipo char. Desta forma as atribuições estão correctas. (De notar no caracter '\0' no final, que significa fim-da-string.)
No entanto, esta forma de trabalhar não é muito prática. Por esta razão, e em geral para facilitar o trabalho com strings, existem muitas instruções para ajudar na manipulação de strings. Essas instruções estão definidas na biblioteca string.h e quando as queremos utilizar temos que fazer o "include" da biblioteca no início do programa com
  #include <string.h>


string.h

As seguintes funções de string.h são interessantes:
 
strcpy copia o conteúdo de uma string para outra
strcat acrescenta uma string a outra
strcmp compara duas strings
strlen retorna o comprimento (número de caracteres, excluindo \0) de uma string
strstr procura pela posição de uma string numa outra string

 
strcpy
diminuitivo de "string copy". copia o conteúdo de uma string para outra.
definição da função: int *strcpy(char *s1, const char* s2)
copia o conteúdo de s2 para s1.
É uma função que tem dois parâmetros, duas strings (array de char, pointer para char, portanto) s1 e s2, e copia o conteúdo de s2 para s1. As alterações em s1 são permanentes. A função retorna um int que indica o sucesso da operação. Para já podemos ignorar este resultado, para não complicar mais. Iremos ignorar também a palavra const da declaração do segundo parâmetro. Um exemplo:
  char n[10];
  strcpy(n, "Benfica");
  printf("%s\n", n);
resultado 
  Benfica

Efectivamente, o que a função strcpy está a fazer é copiar os caracteres da string s2 para s1 até que seja encontrado o caracter fim-da-string:
do
{
  *s1 = *s2;          // copy a character; copy contents of
                      //   address s2 to address s1
  s1++;               // make pointer s1 point to next character
  s2++;               // make pointer s2 point to next character
}
while (*s2 != '\0');  // repeat until end-of-string encountered
 

strcat
diminuitivo de "string concatenate". adiciona uma string a outra string 
definição da função:   char *strcat(char *s1, const char *s2)
acrescenta s2 ao final de s1.
Dois parâmetros, s1 e s2 são ponteiros para char (arrays de char). Mais uma vez, como em cima, iremos ignorar o valor (ponteiro char) que a função retorna.
Exemplo:
  char n[30];
  strcpy(n, "Benfica");
  strcat(n, " o glorioso");
  printf("%s\n", n);
resultado
  Benfica o glorioso
Efectivamente, a função strcat é equivalente ao seguinte código:
while (*s1 != '\0')  // look for
  s1++;              //   end-of-string
strcpy(s1, s2);      // now copy the string s2 at place of the new
                     //   address s1 that points to \0
 
strcmp
diminuitivo de "string compare". compara duas strings
definição da função:     int strcmp(const char *s1, const char *s2)
compara s1 com s2. Se iguais retorna 0, se alfabeticamente s1<s2 retorna um número negativo, ou retorna um número positivo se s1>s2
Exemplo:
  char n[30], m[30];
  int cmp;

  strcpy(n, "Benfica");
  strcpy(m, "Sporting");
  cmp = strcmp(n, m);
  printf("%s\n", n);
  if (cmp==0)
    printf("strings are equal");
  else
    if (cmp>0)
      printf("%s is after %s", n, m);
    else
      printf("%s is before %s", n, m);
resultado
  Benfica is before Sporting

A função strcmp poderia ser implementada com algo semelhante ao que se segue:
  // possible implementation of strcmp
while ((*s1==*s2) && (*s1!='\0'))  // still equal and not end-of-string?
{
  s1++;    // move pointer s1 one place
  s2++;    // move pointer s2 one place
}
return((int) *s1 - *s2);  // return difference between contents of s1 and s2
 
 
strlen
diminuitivo de "string length". Retorna o número de caracteres da string (sem contar com \0)
definição da função:     int strlen(const char *s1)
Retorna o número de caracteres da string s1 (sem contar com \0) 
Exemplo:
  char n[30];
  strcpy(n, "Benfica");
  printf("%s has %d characters", n, strlen(n));
resultado
  Benfica has 7 characters

A função strlen poderia ser implementada com algo semelhante a:
cnt=0;
while (*s1 != '\0')
{
  cnt++;
  s1++;
}
return(cnt);
 
 
strstr
diminuitivo de "string string". Retorna a posição de uma string numa outra string. 
definição da função:     char *strstr(const char *s1, const char *s2)
Retorna um ponteiro (array de char) para a posição do texto s2 no texto s1.
Exemplo: 
  char n[30];
  char *p;
  strcpy(n, "Benfica");

  p = strstr(n, "fic");
  printf("%s", p);
resultado 
  fica


Arrays de strings

Arrays de strings são arrays de arrays de caracteres:
Por exemplo, se quisermos armazenar os nomes de três equipas de futebol portuguesas, podemos fazê-lo com
  char n[3][10];
A figura em baixo mostra como os nomes podem ser armazenados neste array de strings.

for (i=0; i<3; i++)
  printf("%s\n", n[i]);
resultado:
 Benfica
 Sporting
 Porto


Peter Stallinga. Universidade do Algarve, 29 November 2002