MC102MN

Introdução a Algoritmos e programação de computadores

Aula XII, Introdução a strings

Strings em C são como se chamam cadeias de caracteres que podem representar texto. Strings são, internamente, vetores de caracteres, então a declaração de uma string em C é:

char meu_nome[20];
para você escrever strings em C você usa aspas duplas, e para caracteres aspas simples. Ou seja, 'a' é um caracter e "a" é uma string. Toda string em C é um vetor de caracteres com o caracter '\0' no final. Internamente, a cara do vetor é
v0v1v2v3v4v5v6v7v8v9
'a''l''e''x''a''n''d''r''e''\0'

Isso permite que as funções que lidem com strings não precisem receber o tamanho da string como parâmetro; elas podem calcular o tamanho contando quantos caracteres existem até o primeiro '\0'. Uma função para calcular o tamanho de uma string é strlen, e pode ser definida como

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

Ao mesmo tempo, se você for criar uma string manualmente e esquecer de colocar o '\0' no final todas as partes do programa que lidam com strings vão entrar em parafuso. Você pode, em C, definir uma string também das seguintes formas:

char nome[20] = "alexandre";
char nome[] = "alexandre";

Existem diferenças sutis entre essas formas mas não falaremos delas agora.

Para ler uma string que é só uma palavra, o comando é

char string[20];
scanf("%s", string);
Reparem que não tem o & antes de string. Isso é porque string é um vetor, e passar um vetor pra uma função já dá à função o direito de alterá-lo (ao contrário de variável, que precisa de & antes). Para imprimir o comando é
printf("%s", string);
Se você quiser ler uma string que contenha espaços, o comando é mais complexo, e é
char string[20];
scanf("%20[^\n]", string);
O 20 tem que ser trocado pro tamanho da string. Repare que isso pode deixar a string sem o '\0' no final, então depois de executar isso é sempre bom copiar o '\0' com
string[19] = '\0';

Em C strings não podem ser comparadas com ==; é necessário usar as funções strcmp (strcmp(a,b) retorna -1 se a vem antes de b, 0 se são iguais e 1 se a vem depois de b na ordem alfabética) ou strcasecmp (que é igual a strcmp mas não diferencia letras maiúsculas de minúsculas).

Operações com strings

Já vimos strlen, vamos ver outras. Todas essas operações estão no cabeçalho

#include <string.h>

Para copiar a string b em cima da string a uma função é

void strcpy(char a[], char b[]) {
  int i;
  for (i = 0; b[i] != '\0'; i++) {
    a[i] = b[i];
  }
  a[i] = b[i];
}

Para copiar a string b pra depois do fim da string a:

void strcat(char a[], char b[]) {
  int i;
  while (a[i] != '\0') i++;
  do {
    a[i] = b[i];
  } while (b[i] != '\0');
}

Para achar a posição do caracter c na string a uma função é:

int strchr(char a[], char c) {
  int i;
  for (i = 0; a[i] != '\0'; i++)
    if (a[i] == c) return i;
  return -1;
}

Para converter uma string em inteiro

int atoi(char a[]) {
  int i, n = 0;
  for (i = 0; a[i] != '\0'; ++i) {
    n *= 10;
    n += a[i]-'0';
  }
  return n
}
Essa função, se chamada com "123" retorna 123.

Sugestão para praticar: implementar strcmp.

Author: Alexandre Tachard Passos <alexandre.tp@gmail.com>

Date: 2010-09-16 22:46:45 BRT

HTML generated by org-mode 6.21b in emacs 23