capítulo 8 - caracteres e strings

23
1 2000 Prentice Hal All rights reserved. Capítulo 8 - Caracteres e Strings Sumário 8.1 Introdução 8.2 Conceitos Fundamentais de Strings e Caracteres 8.3 Biblioteca de Manipulação de Caracteres 8.4 Funções de Conversão de Strings 8.5 Funções da Biblioteca-padrão de Entrada/Saída 8.6 Funções de Manipulação de Strings da Biblioteca de Manipulação de Strings 8.7 Funções de Comparação da Biblioteca de Manipulação de Strings 8.8 Funções de Pesquisa da Biblioteca de Manipulação de Strings 8.9 Funções de Memória da Biblioteca de Manipulação de Strings 8.10 Outras Funções da Biblioteca de Manipulação de Strings

Upload: scout

Post on 22-Jan-2016

43 views

Category:

Documents


4 download

DESCRIPTION

Capítulo 8 - Caracteres e Strings. Sumário 8.1Introdução 8.2Conceitos Fundamentais de Strings e Caracteres 8.3Biblioteca de Manipulação de Caracteres 8.4Funções de Conversão de Strings 8.5Funções da Biblioteca-padrão de Entrada/Saída - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Capítulo 8 - Caracteres e Strings

1

2000 Prentice Hall, Inc.All rights reserved.

Capítulo 8 - Caracteres e Strings

Sumário8.1 Introdução8.2 Conceitos Fundamentais de Strings e Caracteres8.3 Biblioteca de Manipulação de Caracteres8.4 Funções de Conversão de Strings8.5 Funções da Biblioteca-padrão de Entrada/Saída 8.6 Funções de Manipulação de Strings da Biblioteca de Manipulação de Strings8.7 Funções de Comparação da Biblioteca de Manipulação de Strings8.8 Funções de Pesquisa da Biblioteca de Manipulação de Strings8.9 Funções de Memória da Biblioteca de Manipulação de Strings8.10 Outras Funções da Biblioteca de Manipulação de Strings

Page 2: Capítulo 8 - Caracteres e Strings

2

2000 Prentice Hall, Inc.All rights reserved.

8.1 Introdução

• Apresenta algumas funções da biblioteca-padrão– Processamento fácil de strings e caracteres

– Programas podem processar caracteres, strings, linhas de texto, e blocos de memória

• Estas técnicas são usadas para fazer– Processadores de palavras

– Software de formatação de página

– Programas editores de texto

Page 3: Capítulo 8 - Caracteres e Strings

3

2000 Prentice Hall, Inc.All rights reserved.

8.2 Conceitos Fundamentais de Strings e Caracteres

• Caracteres– Construindo blocos de programas

• Todo programa é uma seqüência de caracteres significativos agrupados

– Constante caractere• Um valor int representado como um caractere entre apóstrofos• 'z' representa o valor inteiro de z

• Strings– Série de caracteres tratada como uma única unidade

• Podem incluir letras, dígitos e caracteres especiais (*, /, $)

– Literal string (constante string) – escrita entre aspas• "Hello"

– Strings são arrays de caracteres• String é um apontador para o primeiro caractere• Valor de um string é o endereço do primeiro caractere

Page 4: Capítulo 8 - Caracteres e Strings

4

2000 Prentice Hall, Inc.All rights reserved.

8.2 Conceitos Fundamentais de Strings e Caracteres

• Declarações de String– Declare como um array de caracteres ou uma variável de

tipo char *char color[] = "blue";char *colorPtr = "blue";

– Lembre-se que strings representados como arrays de caracteres terminam com '\0'• color has 5 elements

• Entrando com strings– Use scanf

scanf("%s", word);• Copia a entrada para word[]• Não necessita & (porque um string é um apontador)

– Lembre-se de deixar espaço no array para o '\0'

Page 5: Capítulo 8 - Caracteres e Strings

5

2000 Prentice Hall, Inc.All rights reserved.

8.3 Biblioteca de Manipulação de Caracteres

• Biblioteca de manipulação de caracteres – Inclui funções para realizar testes úteis e manipulações de

dados caracteres

– Cada função recebe um caractere (um int) ou EOF como um argumento

• O slide seguinte contém uma tabela de todas as funções em <ctype.h>

Page 6: Capítulo 8 - Caracteres e Strings

6

2000 Prentice Hall, Inc.All rights reserved.

8.3 Biblioteca de Manipulação de Caracteres

Protótipo Descrição

int isdigit( int c ) Retorna verdadeiro se c é um dígito e falso caso contrário.

int isalpha( int c ) Retorna verdadeiro se c é um letra e falso caso contrário.

int isalnum( int c ) Retorna verdadeiro se c é um dígito or uma letra e falso caso contrário.

int isxdigit( int c ) Retorna verdadeiro se c é um caractere dígito hexadecimal e falso caso contrário.

int islower( int c ) Retorna verdadeiro se c é uma letra minúscula e falso caso contrário.

int isupper( int c ) Retorna verdadeiro se c é uma letra maiúscula; falso caso contrário.

int tolower( int c ) Se c é auma letra maiúscula, tolower retorna c como uma letra minúscula. Caso contrário, tolower retorna o argumento sem modificação.

int toupper( int c ) Se c é uma letra minúscula, toupper retorna c como uma letra maiúscula. Caso contrário, toupper retorna o argumento sem modificação.

int isspace( int c ) Retorna verdadeiro se c é um caractere espaço em branco—nova-linha ('\n'), espaço (' '), form feed ('\f'), carriage return ('\r'), tab horizontal ('\t'), or tab vertical ('\v')—e falso caso contrário

int iscntrl( int c ) Retorna verdadeiro se c é um caractere de controle e falso caso contrário.

int ispunct( int c ) Retorna verdadeiro se c é um caractere de impressão diferente de um espaço, um dígito, or uma letra e falso caso contrário.

int isprint( int c ) Retorna o valor verdadeiro se c é um caractere de impressão, incluindo espaço (' ') e falso caso contrário.

int isgraph( int c ) Retorna verdadeiro se c é um caractere de impressão diferente de um espaço (' ') e falso caso contrário.

Page 7: Capítulo 8 - Caracteres e Strings

Outline7

Outline

2000 Prentice Hall, Inc.All rights reserved.

1. Carrega cabeçalho

2. Realiza testes

3. Imprime

1 /* Fig. 8.2: fig08_02.c2 Usando as funções isdigit, isalpha, isalnum, and isxdigit */

3 #include <stdio.h>4 #include <ctype.h>56 int main()7 { 8 printf( "%s\n%s%s\n%s%s\n\n", “De acordo com isdigit: ",9 isdigit( '8' ) ? "8 é um " : "8 não é um ", "dígito",10 isdigit( '#' ) ? "# é um " : 11 "# não é um ", " dígito" );12 printf( "%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n", 13 “De acordo com isalpha:",14 isalpha( 'A' ) ? "A é uma " : "A não é uma ", “letra",15 isalpha( 'b' ) ? "b é uma " : "b não é uma ", "letra",16 isalpha( '&' ) ? "& é uma " : "& não é uma ", "letra",17 isalpha( '4' ) ? "4 é uma " : 18 "4 não é uma ", “letra" );19 printf( "%s\n%s%s\n%s%s\n%s%s\n\n", 20 “De acordo com isalnum:",21 isalnum( 'A' ) ? "A é um " : "A não é um ", 22 “dígito ou uma letra",23 isalnum( '8' ) ? "8 é um " : "8 não é um ", 24 “dígito ou uma letra",25 isalnum( '#' ) ? "# é um " : "# não é um ", 26 "dígito ou uma letra" );27 printf( "%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n", 28 "De acordo com isxdigit:",29 isxdigit( 'F' ) ? "F é um " : "F não é um ", 30 “dígito hexadecimal",31 isxdigit( 'J' ) ? "J é um " : "J não é um ", 32 “dígito hexadecimal",

Page 8: Capítulo 8 - Caracteres e Strings

Outline8

Outline

2000 Prentice Hall, Inc.All rights reserved.

3. Impressão

Saída do programa

33 isxdigit( '7' ) ? "7 é um " : "7 não é um ",

34 “dígito hexadecimal",

35 isxdigit( '$' ) ? "$ é um " : "$ não é um ",

36 “dígito hexadecimal",

37 isxdigit( 'f' ) ? "f é um " : "f não é um ",

38 “dígito hexadecimal" );

39 return 0;

40 }

De acordo com isdigit:8 é um dígito# não é um dígito De acordo com isalpha:A é uma letrab é uma letra& não é uma letra4 não é uma letra De acordo com isalnum:A é um dígito ou uma letra8 é um dígito ou uma letra# não é um dígito ou uma letra De acordo com isxdigit:F é um dígito hexadecimalJ não é um dígito hexadecimal7 é um dígito hexadecimal$ não é um dígito hexadecimalf é um dígito hexadecimal

Page 9: Capítulo 8 - Caracteres e Strings

9

2000 Prentice Hall, Inc.All rights reserved.

8.4 Funções de Conversão de String

• Funções de Conversão– Em <stdlib.h> (biblioteca geral de utilitários)

• Converte strings de dígitos em valores inteiros ou de ponto flutuante

Protótipo Descrição

double atof( const char *nPtr ) Converte o string nPtr em double.

int atoi( const char *nPtr ) Converte o string nPtr em int.

long atol( const char *nPtr ) Converte o string nPtr em long int.

double strtod( const char *nPtr, char **endPtr )

Converte o string nPtr em double.

long strtol( const char *nPtr, char **endPtr, int base )

Converte o string nPtr em long.

unsigned long strtoul( const char *nPtr, char **endPtr, int base )

Converte o string nPtr em unsigned long.

Page 10: Capítulo 8 - Caracteres e Strings

Outline10

Outline

2000 Prentice Hall, Inc.All rights reserved.

1. Inicializa variável

2. Converte string

2.1 Atribui à variável

3. Imprime

Saída do programa

1 /* Fig. 8.6: fig08_06.c

2 Usando atof */

3 #include <stdio.h>

4 #include <stdlib.h>

5

6 int main()

7 {

8 double d;

9

10 d = atof( "99.0" );

11 printf( "%s%.3f\n%s%.3f\n",

12 “O string \"99.0\" convertido em double is ", d,

13 “O valor convertido dividido por 2 é ",

14 d / 2.0 );

15 return 0;

16 }

O string "99.0" convertido em double is 99.000O valor convertido dividido por 2 é 49.500

Page 11: Capítulo 8 - Caracteres e Strings

11

2000 Prentice Hall, Inc.All rights reserved.

8.5 Funções da Biblioteca-padrão de Entrada/Saída

• Funções em <stdio.h>– Usadas para manipular caracteres e dados string

Protótipo da função Descrição da Função

int getchar( void ); Obtém o próximo caractere do dispositivo-padrão de entrada e o retorna como um inteiro.

char *gets( char *s ); Obtém caracteres do dispositivo-padrão de entrada para dentro de um array s até que um caractere nova-linha ou fim-de-arquivo seja encontrado. Um caractere terminal null é adicionado ao array.

int putchar( int c ); Imprime o caractere armazenado em c.

int puts( const char *s ); Imprime o string s seguido pelo caractere nova-linha.

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

Equivalente ao printf, exceto que a saída é armazenada no array s em vez de impressa na tela.

int sscanf( char *s, const char *format, ... );

Equivalente ao scanf, exceto que a entrada é lida do array s em vez de ser lida do teclado.

Page 12: Capítulo 8 - Caracteres e Strings

Outline12

Outline

2000 Prentice Hall, Inc.All rights reserved.

1. Inicializa variáveis

2. Entra

3. Imprime

3.1 Definição da função (note a recursividade)

Saída do programa

1 /* Fig. 8.13: fig08_13.c2 Usando gets e putchar */3 #include <stdio.h>45 int main()6 { 7 char sentenca[ 80 ];8 void reverse( const char * const );9 10 printf( “Entre com uma linha de texto:\n" );11 gets( sentenca );1213 printf( "\nA linha impressa na ordem inversa é:\n" );14 reverse( sentenca );1516 return 0;17 }1819 void reverse( const char * const sPtr )20 { 21 if ( sPtr[ 0 ] == '\0' )22 return;23 else { 24 reverse( &sPtr[ 1 ] );25 putchar( sPtr[ 0 ] );26 }27 }Entre com uma linha de texto:Caracteres e Strings A linha impressa na ordem inversa é:sgnirtS dna seretcaraC

reverse chama a si própria usando substrings do string original. Quando ela alcança o caractere '\0' imprime usando putchar

Page 13: Capítulo 8 - Caracteres e Strings

13

2000 Prentice Hall, Inc.All rights reserved.

8.6 Funções de Manipulação de Strings da Biblioteca de Manipulação

de Strings• A biblioteca de manipulação de strings tem

funções para– Manipular dados string

– Pesquisar strings

– Separar partes de strings

– Determinar tamanho de string

Protótipo da função Descrição da função char *strcpy( char *s1, const char *s2 )

Copia o string s2 para o array s1. O valor de s1 é retornado.

char *strncpy( char *s1, const char *s2, size_t n )

Copia no máximo n caracteres do string s2 para o array s1. O valor de s1 é retornado.

char *strcat( char *s1, const char *s2 )

Anexa o string s2 ao array s1. O primeiro caractere de s2 sobrepõe o caractere terminal null de s1. O valor de s1 é retornado.

char *strncat( char *s1, const char *s2, size_t n )

Anexa no máximo n caracteres do string s2 ao array s1. O primeiro caractere de s2 sobrepões o caractere terminal null de s1. O valor de s1 é retornado.

Page 14: Capítulo 8 - Caracteres e Strings

Outline14

Outline

2000 Prentice Hall, Inc.All rights reserved.

1. Inicializa variáveis

2. Chama funções

3. Imprime

Saída do programa

1 /* Fig. 8.19: fig08_19.c

2 Usando strcat e strncat */

3 #include <stdio.h>

4 #include <string.h>

5

6 int main()

7 {

8 char s1[ 20 ] = “Feliz ";

9 char s2[] = “Ano Novo ";

10 char s3[ 40 ] = "";

11

12 printf( "s1 = %s\ns2 = %s\n", s1, s2 );

13 printf( "strcat( s1, s2 ) = %s\n", strcat( s1, s2 ) );

14 printf( "strncat( s3, s1, 6 ) = %s\n", strncat( s3, s1, 6 ) );

15 printf( "strcat( s3, s1 ) = %s\n", strcat( s3, s1 ) );

16 return 0;

17 }

s1 = Feliz s2 = Ano Novo strcat( s1, s2 ) = Feliz Ano Novostrncat( s3, s1, 6 ) = Felizstrcat( s3, s1 ) = Feliz Feliz Ano Novo

Page 15: Capítulo 8 - Caracteres e Strings

15

2000 Prentice Hall, Inc.All rights reserved.

8.7 Funções de Comparação da Biblioteca de Manipulação de Strings• Comparando strings

– O computador compara o código numérico ASCII dos caracteres no string

– Apêndice D tem uma lista dos código dos caracteres

int strcmp( const char *s1, const char *s2 );– Compara o string s1 com o s2– Retorna um número negativo se s1 < s2, zero se s1 == s2 ou um número positivo se s1 > s2

int strncmp( const char *s1, const char *s2, size_t n );

– Compara até n caracteres do string s1 com o string s2– Retorna valores como acima

Page 16: Capítulo 8 - Caracteres e Strings

16

2000 Prentice Hall, Inc.All rights reserved.

8.8 Funções de Pesquisa da Biblioteca de Manipulação de Strings

Protótipo da Função Descrição da Função

char *strchr( const char *s, int c );

Localiza a primeira ocorrência do caractere c no string s. Se c é encontrado, um apontador para c in s é retornado. Caso contrário, um apontador NULL é retornado.

size_t strcspn( const char *s1, const char *s2 );

Determina e retorna o tamanho do segmento inicial do s1 que consiste de caracteres não contidos no string s2.

size_t strspn( const char *s1, const char *s2 );

Determina e retorna o tamanho do segmento inicial do string s1 que consiste só de caracteres contidos no string s2.

char *strpbrk( const char *s1, const char *s2 );

Localiza a primeira ocorrência no s1 de qualquer caractere no string s2. Se um caractere do string s2 é encontrado, um apontador para o caractere em string s1 é retornado. Caso contrário, um apontador NULL é retornado.

char *strrchr( const char *s, int c );

Localiza a última ocorrência de c no string s. Se c é encontrado, um apontador para c no string s é retornado. Caso contrário, um apontador NULL é retornado.

char *strstr( const char *s1, const char *s2 );

Localiza a primeira acorrência no string s1 do string s2. Se o string é encontrado, um apontador para o string in s1 é retornado. Caso contrário, um apontador NULL é retornado.

char *strtok( char *s1, const char *s2 );

Uma seqüência de chamadas a strtok divide o string s1 em “tokens”—trechos lógicos, como palavras em uma linha de texto—separados por caracteres contidos no string s2. A primeira chamada contém s1 como o primeiro argumento, e as chamadas subseqüentes pa continuar dividindo o mesmo string contém NULL como o primeiro argumento. Um apontador para o token corrente é retornado por cada chamada. Se não existir mais tokens quando a função for chamada, NULL é retornado.

Page 17: Capítulo 8 - Caracteres e Strings

Outline17

Outline

2000 Prentice Hall, Inc.All rights reserved.

1. Inicializa variáveis

2. Chama funções

3. Imprime

Saída do programa

1 /* Fig. 8.27: fig08_27.c

2 Usando strspn */

3 #include <stdio.h>

4 #include <string.h>

5

6 int main()

7 {

8 const char *string1 = “O valor é 3.14159";

9 const char *string2 = "aeoi lsOrv";

10

11 printf( "%s%s\n%s%s\n\n%s\n%s%u\n",

12 "string1 = ", string1, "string2 = ", string2,

13 “O tamanho do segmento inicial de string1",

14 "contendo só caracteres do string2 = ",

15 strspn( string1, string2 ) );

16 return 0;

17 }

string1 = O valor é 3.14159string2 = aeoi lsOrv O tamanho do seguimento inicial de string1Contendo só caracteres de string2 = 7

Page 18: Capítulo 8 - Caracteres e Strings

Outline18

Outline

2000 Prentice Hall, Inc.All rights reserved.

1. Inicializa variáveis

2. Chama funções

3. Imprime

Saída do programa

1 /* Fig. 8.29: fig08_29.c2 Usando strtok */3 #include <stdio.h>4 #include <string.h>56 int main()7 { 8 char string[] = “Esta é uma frase com 7 tokens";9 char *tokenPtr;10 11 printf( "%s\n%s\n\n%s\n",12 “O string a ser dividido é:", string, 13 “Os tokens são:" );14 15 tokenPtr = strtok( string, " " );1617 while ( tokenPtr != NULL ) { 18 printf( "%s\n", tokenPtr );19 tokenPtr = strtok( NULL, " " );20 }2122 return 0;23 }O string a ser dividido é:Esta é uma frase com 7 tokens Os tokens são:EstaÉUmaFraseCom7tokens

Page 19: Capítulo 8 - Caracteres e Strings

19

2000 Prentice Hall, Inc.All rights reserved.

8.9 Funções de Memória da Biblioteca de Manipulação de Strings• Funções de memória

– Em <stdlib.h>– Manipulam, comparam, e pesquisam blocos de memória

– Podem manipular qualquer bloco de dados

• Parametros apontadores são void *– Qualquer apontador pode ser atribuído a void *, e vice

versa– void * não pode ser desreferenciado

• Cada função recebe um tamanho como argumento, especificando o número de bytes (caracteres) a processar

Page 20: Capítulo 8 - Caracteres e Strings

20

2000 Prentice Hall, Inc.All rights reserved.

8.9 Memory Functions of the String- handling Library

Protótipo Descrição void *memcpy( void *s1, const void *s2, size_t n )

Copia n caracteres do objeto apontado por s2 para o objeto apontado por s1. É retornado um apontador para o objeto resultante.

void *memmove( void *s1, const void *s2, size_t n )

Copia n caracteres do objeto apontado por s2 para o objeto apontado por s1. A cópia é realizada como se os caracteres fossem copiados primeiramente do objeto apontado por s2 para um array temporário, e então copiado do array temporário para o objeto apontado por s1. É retornado um apontador para o objeto resultante.

int memcmp( const void *s1, const void *s2, size_t n )

Compara os primeiros n caracteres dos objetos apontados por s1 e s2. A função retorna 0, menor que 0, ou maior que 0 se s1 é igual a, menor que ou maior que s2, respectivamente.

void *memchr(const void *s, int c, size_t n )

Localiza a primeira ocorrência de c (convertido para unsigned char) nos primeiros n caracteres do objeto apontado por s. Se c é encontrado, um apontador para c no objeto é retornado. Caso contrário, 0 é retornado.

void *memset( void *s, int c, size_t n )

Copia c (convertido para unsigned char) para os primeiros n caracteres do objeto apontado por s. É retornado um apontador para o resultado.

Page 21: Capítulo 8 - Caracteres e Strings

Outline21

Outline

2000 Prentice Hall, Inc.All rights reserved.

1. Inicializa variáveis

2. Chama funções

3. Imprime

Saída do programa

1 /* Fig. 8.32: fig08_32.c

2 Usando memmove */

3 #include <stdio.h>

4 #include <string.h>

5

6 int main()

7 {

8 char x[] = “Lar Doce lar";

9

10 printf( "%s%s\n",

11 “O string no array x antes de memmove é: ", x );

12 printf( "%s%s\n",

13 “O string no array x depois de memmove é: ",

14 memmove( x, &x[ 4 ], 8 ) );

15

16 return 0;

17 }

O string no array x antes de memmove é: Lar Doce LarO string no array x depois de memmove é: Doce Lar Lar

Page 22: Capítulo 8 - Caracteres e Strings

22

2000 Prentice Hall, Inc.All rights reserved.

8.10Outras funções da Biblioteca de Manipulação de Strings

• char *strerror( int errornum ); – Cria uma mensagem de erro dependente do sistema baseada

em errornum– Retorna uma apontador para o string

• size_t strlen( const char *s ); – Retorna o número de caracteres (antes do NULL) no string s

Page 23: Capítulo 8 - Caracteres e Strings

Outline23

Outline

2000 Prentice Hall, Inc.All rights reserved.

1. Chama função

2. Imprime

Saída do programa

1 /* Fig. 8.37: fig08_37.c

2 Usando strerror */

3 #include <stdio.h>

4 #include <string.h>

5

6 int main()

7 {

8 printf( "%s\n", strerror( 2 ) );

9 return 0;

10 }

Error 2