07 strings.pdf

25
Alexandre Mota [email protected]

Upload: luiz-rafael

Post on 25-Sep-2015

213 views

Category:

Documents


0 download

TRANSCRIPT

  • Alexandre Mota [email protected]

  • Na linguagem de programao C, uma frase (ou string) no um tipo de dado especfico

    Faz-se simplesmente o reuso do tipo de dado bsico char

    Assim, uma string de tamanho 10 declarado como: char nome[10];

  • Tal qual um vetor tradicional, uma string pode ser inicializada na declarao

    Da seguinte forma: char nome[10] = Joao;

    Note que como um vetor tambm poderia ser inicializado assim: char nome[10] = { J, o, a, o, \0};

    Aparece um curioso caracter \0 no final. Ele marca o final da string

  • Strings usam aspas e apstrofos so para caracteres individuais

    A string Joao (4 caracteres visveis) na verdade correspondem seqncia { J, o, a, o, \0 }

    O caracter \0 que marca o final da string ocupa uma posio

    Assim, para a declarao char nome[10], na verdade temos no mximo 9 caracteres teis a usar

  • Este caracter especial usado para demarcar o final da string

    E permitir que tamanhos variveis possam ser usados sem usurio se preocupar em controlar isto

    Casos extremos (para char nome[10]): Um nome vazio seria nome[0] = \0; Um nome cheio seria nome = abcdefghi;

  • O comando bsico para isto o scanf Supondo que temos uma string chamada

    nome O comando

    scanf(%s, nome); Carrega o que for digitado pelo teclado

    nesta varivel Note que a varivel no tem o & como

    prefixo. Isto ser explicado posteriormente

    Infelizmente este comando, com estes parmetros, s l

    strings sem espaos internos!

  • Para ler strings com espaos internos, precisamos usar esta nova configurao scanf( %[^\n], nome);

    O espao antes de % instrui C a descartar espaos antes da primeira palavra

    A seqncia de controle ^\n instrui C a ler toda a seqncia de caracteres at encontrar um \n ()

    Mas esta configurao ainda tem um problema. O caracter \n no pode surgir alm do que a string

    comporta (Violao de memria)!

  • Faa um programa em C que leia seu primeiro e ltimo nomes, bem como seu sexo (como char M ou F), e mostre na tela o seguinte:

    Sr. ltimo, Primeiro (se for Masculino) Sra. ltimo, Primeiro (se for Feminino)

    Obs.: Com char usa-se e como vetor de chars (strings), usa-se

  • Precisamos garantir que a string lida caber na varivel, sem violar limites de memria

    Ento, supondo a declarao char nome[21];

    Usamos a seguinte configurao scanf( %20[^\n], nome);

    Note o 20 vs 21 entre declarao e scanf. Por que isto ocorre?

  • A funo gets bem mais simples que a funo scanf

    Para ler string nome, basta gets(nome);

    A sua nica desvantagem que no limita o tamanho de uma string lida

    Pode violar memria e causar mal funcionamento do programa

  • Como strings so vetores, h comandos especiais para lidar com elas

    Por exemplo, no se pode atribuir uma string diretamente exceto na inicializao char nome[10]; nome = Alex; // Est incorreto!!!

    preciso usar uma biblioteca chamada string.h, onde h vrias funes pr-definidas

  • O simples comando de atribuio nome = Alex;

    O qual est incorreto, deve ser substitudo pela funo (correto) strcpy(nome, Alex);

    A funo strcpy (string copy) est definida na biblioteca string.h, a qual se faz necessria para compilar corretamente tais programas

  • Por trs da funo strcpy strcpy(novo, antigo); // Equival. a novo = antigo

    H um programa bem simples Este programa copia cada posio do

    vetor (string) antigo para a posio correspondente no vetor (string) novo

    Algo como: i = 0;

    while(antigo[i]!=\0) { novo[i] = antigo[i]; i++ }

  • Note pelo cdigo anterior que o comando de atribuio no existe para strings

    Mas a funo strcpy definida em termos do comando de atribuio entre elementos de vetores

    Caracter especial \0 serve de ponto de parada, como j havamos dito anteriormente

  • Do mesmo modo que temos o comando x = x + 2 para inteiros

    Temos um correspondente para strings a funo strcat (string catenation) Uma chamada como

    strcat(novo, antigo); equivalente ao comando (incorreto para

    strings) novo = novo + antigo;

  • Faa um programa que declara 2 strings, uma de 30 caracteres e outra de 15 caracteres. Leia do teclado ambas as strings mas com no mximo 14 caracteres cada. Concatene a string de 15 caracteres ao final da de 30 sem usar o comando strcat. Apresenta a string resultante.

  • Alm de no termos atribuio, tambm no podemos comparar strings como os demais tipos

    Por exemplo, enquanto podemos fazer x == y, ou x < y

    para nmeros e at caracteres Para strings, precisamos usar a funo

    strcmp (string comparison)

  • A chamada strcmp(string1, string2)

    retorna um nmero inteiro H 3 casos possveis:

    0 significa que string1 e string2 so iguais Negativo significa que string1 menor que

    string2 Positivo significa que string1 maior que

    string2

  • Tal qual a funo strcpy definida, a funo strcmp funciona nos elementos internos dos vetores

    Resultado da funo basicamente uma operao aritmtica baseada na i-sima posio dos vetores de caracteres string1[i] string2[i]

    Note que expresso d 0 se caracteres forem iguais, > 0 se e < 0 se

  • Faa um programa que resulta no mesmo comportamento da funo strcmp para duas strings de tamanhos 20 e 15 respectivamente.

  • Apesar da declarao definir um tamanho para uma string

    Vimos que o caracter \0 permite tamanhos dinmicos

    Baseada na posio do caracter \0, a funo strlen resulta no tamanho (nm. natural) dinmico da string

    Seu uso : strlen(nome);

  • Como seria a implementao da funo strlen? Faa um programa que exiba este mesmo comportamento.

  • Faa um programa que l uma string de no mximo 10 caracteres e informa ao usurio se ela um palndromo

    Isto , se a palavra lida idntida a sua verso invertida Ex.: ama ou anilina ou arara

  • A entrada de dados pelo teclado pode ficar acumulada

    Se isto ocorrer, o scanf pode no funcionar corretamente (Pular a entrada)

    Se isto ocorrer, voc dever usar: fflush(stdin) [Windows] ou __fpurge(stdin)

    [Linux] ou rewind(stdin)

    Antes de cada scanf

  • Alexandre Mota [email protected]