Processamento de cadeias

Calcular o comprimento

unsigned comprimento(char str[]);

Contar o número de carateres até ao terminador '\0'.

Exemplos de uso:

char str1[] = {'A', 'B', '\0'};
char str2[] = "Hello";
n = comprimento(str1);
m = comprimento(str2);
   // n igual a 2,  m igual a 5

Comprimento

Solução apresentada na aula anterior.

unsigned comprimento(char str[])  {
  unsigned i = 0;
  while(str[i] != '\0') 
    i++;
  return i;
}

Copiar

void copiar(char dest[], char origem[]);

Exemplo de uso:

char mesg[] = "Hello!!!";
char texto[100];
copiar(texto, mesg);
  // agora texto contém "Hello!!!"

Copiar (1ª versão)

void copiar(char dest[], char origem[]) {
  int i = 0;
  while(origem[i] != '\0') {
    dest[i] = origem[i];
    i++;
  }
  dest[i] = '\0';  // colocar o terminador
}

Copiar (2ª versão)

void copiar(char dest[], char origem[]) {
  int i = 0;
  while((dest[i]=origem[i]) != '\0') 
    i++;
}

Note que desta forma o terminador '\0' é colocado no teste de condição do ciclo.

Concatenar

void concat(char dest[], char origem[]);

Exemplo de uso:

char texto1[50] = "ABC";
char texto2[50] = "1234";
concat(texto1, texto2);
  // texto1 fica "ABC1234"
  // texto2 continua "1234" (inalterado)

Concatenar (1ª versão)

void concat(char dest[], char origem[]) {
  int i, j;
  i = 0;
  j = comprimento(dest);  // índice do final
  while(origem[i] != '\0') {
    dest[j] = origem[i];
    i ++;
    j ++;
  }
  dest[j] = '\0'; // colocar o terminador
}

Concatenar (2ª versão)

void concat(char dest[], char origem[]) {
  int i, j;
  i = 0;
  j = comprimento(dest);  // índice do final
  while((dest[j]=origem[i]) != '\0') {
    i ++;
    j ++;
  }
}

Desta forma colocamos o terminador no teste da condição do ciclo.

Procurar um carater

int procurar(char str[], char ch);

Exemplo de uso:

char msg[] = "ABABCA";
i = procurar(msg, 'C');
j = procurar(msg, 'D');
 // i igual a 4, j igual a -1

Procurar

int procurar(char str[], char ch)  {
  int i;
  for (i = 0; str[i] != '\0'; i++) {
    if(str[i] == ch) 
      return i; // encontrou
  }
  return -1;    // não encontrou
}

Comparar cadeias

int comparar(char str1[], char str2[]);

Exemplo de uso:

char texto1[] = "ABC";
char texto2[] = "ABC123";
c = comparar(texto1, texto2);
 // resultado 0 (diferentes)

Comparar cadeias

Note que comparar com == não produz o efeito desejado: compara os endereços das variáveis indexadas, não os conteúdos:

char texto1[] = "ABC";
char texto2[] = "ABC";
printf("%d", comparar(texto1, texto2));
  // imprime 1 (conteúdos iguais)
printf("%d", texto1 == texto2);
  // imprime 0 (endereços diferentes)

Comparar cadeias

int comparar(char str1[], char str2[]) {
  int i = 0;
  while(str1[i] != '\0' && str1[i] == str2[i])
    i++;
  return (str1[i] == str2[i]);
}

O ciclo termina quando:

Em qualquer caso: as cadeias são iguais se e só se str1[i] == str2[i].

Imprimir uma linha

void imprimir(char str[]);

Imprimir uma linha

void imprimir(char str[]) {
    int i = 0;
    while(str[i] != '\0') {
        putchar(str[i]);
        i++;
    }
    putchar('\n');
}

Ler uma linha

int ler_linha(char str[], int max_size);

Exemplo de uso:

char texto[100];
n = ler_linha(texto, 100);

Ler uma linha

int ler_linha(char str[], int max_size) {
  int i = 0, ch;
  max_size--;  // máximo carateres a colocar
               // subtrai 1 para o terminador
  while(max_size > 0) {
    ch = getchar();
    if(ch == EOF || ch == '\n')  // fim?
      break;
    str[i++] = ch;
    max_size--;
  }
  str[i] = '\0';  // coloca terminador
  return i; // número de carateres colocado
}