Ferramentas do usuário

Ferramentas do site


prog2:strings

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
prog2:strings [2019/03/29 15:56]
maziero [Manipulação]
prog2:strings [2019/04/09 13:38] (atual)
maziero
Linha 1: Linha 1:
 +====== Strings ======
 +
 +Uma string é uma sequência de caracteres que permite representar nomes, endereços e outras informações textuais.
 +
 +===== Declaração =====
 +
 +Em C, strings são implementada como vetores de caracteres terminados por um caractere especial '​\0'​ (que é considerado no tamanho do vetor). As aspas duplas ("​..."​) são usadas para declarar strings constantes.
 +
 +Exemplos:
 +
 +<code c>
 +char nome[100] ;  // variável com até 99 caracteres
 +char *endereco ;  // ponteiro para uma string (não aloca espaço)
 +endereco = "Rua da Batata, 1000" ;  // string constante (com \0 no fim)
 +</​code>​
 +
 +Deve-se observar que uma string é um vetor de caracteres, então as duas declarações abaixo são equivalentes:​
 +
 +<code c>
 +char codigo[] ​ = "​XT47A"​ ;
 +char codigo[] ​ = { '​X',​ '​T',​ '​4',​ '​7',​ '​A',​ '​\0'​ } ;
 +</​code>​
 +
 +Além disso, a visão da string como vetor permite o acesso aos caracteres individuais que a compõem:
 +
 +<code c>
 +for (i=0; i < strlen (str); i++)      // varre todos os caracteres
 +  if (str[i] >= '​a'​ && str[i] <= '​z'​) // se for letra minúscula
 +    str[i] -= 32 ;                    // converte em letra maiúscula
 +</​code>​
 +
 +===== Leitura e escrita =====
 +
 +A escrita de strings pode ser feita com ''​printf''​ (usando o formato ''​%s''​ ou ''​%NNNs''​),​ ''​puts''​ ou ainda ''​putchar''​ (para escrever caractere por caractere):
 +
 +<code c>
 +char nome[] = "Homer Simpson"​ ;
 +
 +printf ("​Nome:​ %s\n", nome) ;         // com printf
 +
 +puts (nome) ;                         // com puts
 +
 +for (i = 0; i < strlen(nome);​ i++)    // com putchar
 +  putchar (nome[i]) ;
 +</​code>​
 +
 +Por sua vez, a leitura de strings pode ser feita usando a função ''​scanf'':​
 +
 +<code c>
 +#define SIZE 100
 +
 +char nome[SIZE+1] ;  // não esquecer do '​\0'​ no final da string
 +
 +printf ("​Digite seu nome: ") ;
 +
 +// lê até encontrar espaço, tabulação,​ nova linha ou fim de arquivo
 +scanf ("​%s",​ nome) ;
 +
 +// idem, no máximo 20 caracteres
 +scanf ("​%20s",​ nome) ;
 +
 +// lê somente letras e dígitos (até encontrar outro caractere)
 +scanf("​%[A-Za-z0-9]",​ nome);
 +
 +// lê até encontrar nova linha (\n)
 +scanf("​%[^\n]",​ nome);
 +getchar() ;              // para ler o "​\n"​ no fim da linha
 +</​code>​
 +
 +<note important>​
 +Observe que a leitura de uma string deve ser feita em uma variável com **espaço suficiente** para recebê-la, para não gerar um estouro de buffer (//buffer overflow//​).
 +</​note>​
 +
 +Pode-se também usar a função ''​fgets'':​
 +
 +<code c>
 +// lê da entrada padrão até encontrar \n ou SIZE caracteres
 +fgets (nome, SIZE, stdin) ;
 +
 +// a string lida por fgets pode incluir o \n do fim de linha,
 +// se ele foi encontrado; ele pode ser retirado assim:
 +nome[strcspn (nome, "​\n"​)] = 0;
 +</​code>​
 +
 +Para mais informações sobre as funções acima, deve ser consultada a respectiva página de manual Unix.
 +
 +<note warning>
 +A função ''​gets''​ não limita o número de bytes lidos e pode provocar **estouro de buffer**, por isso não deve ser usada! Use a função ''​fgets''​ em seu lugar.
 +</​note>​
 +
 +===== Manipulação =====
 +
 +A manipulação de strings é geralmente efetuada através de funções disponíveis na biblioteca padrão C, que podem ser acessadas através do arquivo de cabeçalho ''​string.h''​. Algumas das funções mais usuais são:
 +
 +^ função ^ operação realizada ^
 +| ''​int strlen (s)''​ | informa o número de caracteres da string ''​s''​ (sem considerar o '​\0'​ final) |
 +| ''​char ∗ strcpy (b, a)''​ | copia a string ''​a''​ no local indicado por ''​b'';​ a área de memória de destino deve ter sido previamente alocada (como variável normal ou dinâmica) |
 +| ''​char ∗ strdup (s)''​ | Aloca uma área de memória dinâmica, copia a string ''​s''​ nela e devolve um ponteiro para a mesma |
 +| ''​char ∗ strncpy (b, a, n)''​ | Copia ''​n''​ caracteres da string ''​a''​ no local indicado por ''​b''​ |
 +| ''​int strcmp (a, b)''​ | Compara as duas strings indicadas, retornando 0 se forem iguais, <0 se a<b e >0 se a>b|
 +| ''​int strncmp (a, b ,​n)''​ | Idem, mas só considera os ''​n''​ primeiros caracteres |
 +| ''​char ∗ strcat (a, b)''​ | Concatena a string ''​b''​ ao final da string ''​a''​ (deve haver espaço disponível previamente alocado) |
 +| ''​char ∗ strncat (a, b, n)''​ | Idem, mas só concatena os ''​n''​ primeiros caracteres |
 +| ''​char ∗ strchr (s, c)''​ | Retorna um ponteiro para a primeira ocorrência do caractere ''​c''​ na string ''​s'',​ ou NULL se não encontrar |
 +| ''​char ∗ strrchr (s, c)''​ | Idem, mas retorna um ponteiro para a **última** ocorrência do caractere |
 +
 +Muitas outras funções para manipulação de strings estão disponíveis na [[http://​man7.org/​linux/​man-pages/​man3/​string.3.html|página de manual]] (comando ''​man string''​) ;
 +
 +===== Exercícios =====
 +
 +Escrever programas em C para:
 +
 +  - Ler uma string da entrada padrão e escrevê-la na saída padrão ao contrário (do final para o início), de forma similar ao comando ''​rev''​ do Unix.
 +  - Calcular o tamanho de uma string (sem usar ''​strlen''​).
 +  - Converter as letras de uma string em maiúsculas.
 +  - Ler linhas da entrada padrão e escrevê-las na saída padrão em ordem alfabética crescente, de forma similar ao comando ''​sort''​ do Unix.
 +  - Remover de uma string os caracteres que não sejam letras, números ou espaço, sem usar string auxiliar.
 +  - Remover de uma string caracteres repetidos em sequência (rr, ss, ee, etc), sem usar string auxiliar.
 +  - Colocar entre colchetes ([ ]) os caracteres de uma string que não sejam letras, números ou espaço; as alterações devem ser feitas na própria string, sem usar string auxiliar.
  
prog2/strings.txt · Última modificação: 2019/04/09 13:38 por maziero