Академический Документы
Профессиональный Документы
Культура Документы
#include <stdio.h> main() { char Cad[100], Str[20] = {"Digite uma palavra"}; printf("%s \n", Str); scanf("%s", Cad); printf("A palavra digitada foi: %s \n", Cad); } Agora o sistema verifica o nmero de caracteres da cadeia que se pretende armazenar, recusando, em nvel de compilao, se este nmero for maior do que n. O armazenamento de uma cadeia de caracteres atravs da funo scanf() tem uma limitao em funo de que esta funo considera tambm (alm da digitao de <enter>) o espao em branco como finalizador da string. Isto implica que uma cadeia de caracteres que possua um espao em branco (o nome de uma pessoa, por exemplo) no possa ser completamente armazenada. Para estes casos, deve-se utilizar a funo gets() cujo prottipo est no arquivo stdio.h e armazena no argumento com o qual foi ativado uma cadeia de caracteres digitada no teclado. Assim para se armazenar uma frase ou o nome completo de uma pessoa, o programa acima deveria ser modificado para o seguinte programa: #include <stdio.h> main() { char Cad[40]; printf("Digite a frase"); gets(Cad); printf("A frase digitada foi: %s \n", Cad); } Repetindo o que j foi dito, necessrio um certo cuidado com execues sucessivas das funes scanf() (para strings) e gets(). O que acontece o seguinte: quando os dados esto sendo digitados, eles so armazenados numa rea chamada buffer e as execues das funes aqui referidas fazem o sistema armazenar os dados do buffer na varivel pretendida. Assim, se no estiver vazio, o contedo do buffer ser armazenado por uma prxima ativao de uma destas funes. prudente, ento, "esvaziar" o buffer antes de uma chamada de uma segunda chamada de scanf() ou de gets(), isto podendo ser feitos atravs da instruo fflhush(stdin) (no prximo captulo, faremos comentrios sobre stdin).
printf("%d", strlen("Brasil")); b) Comparando duas strings. A comparao entre duas strings em relao ordem alfabtica feita atravs da funo de prottipo int strcmp(char *s1, char *s2); que retorna a diferena entre os cdigos ASCII dos primeiros caracteres diferentes do dois parmetros, que podem ser constantes. Por exemplo, a chamada str("Casa", "Caso"); retorna 14, que a diferena entre os cdigos ASCII de 'o' (111) e o de 'a' (97). Naturalmente, se as cadeias so iguais, a funo retorna 0 (zero). c) Convertendo maiusculas para minsculas e vice-versa. A converso das letras de uma string de minsculas para maiusculas feita atravs da funo de prottipo char *strupr(char *s); enquanto que a converso inversa feita atravs da funo char *strlwr(char *s); podendo o parmetro ser uma constante. d) Concatenando uma string a outra.
A concatenao de uma cadeia de caracteres a uma outra cadeia feita atravs da funo
char *strcat(char *s1, char *ss); que retorna a cadeia s1 acrescida dos caracteres de s2, que pode ser uma constante. Por exemplo, a sequncia de instrues char *Str; Str = "Computa"; strcat(Str, "dor"); armazena em Str a cadeia "Computador". e) Fazendo cpia de uma string. Se s1 e s2 foram definidas como strings no se pode fazer uma atribuio do tipo s1 = s2. Se pretendemos armazenar o contedo de s2 em s1 devemos utilizar a funo char *strcpy(char *s1, char *s2); que faz uma cpia do contedo de s2 em s1, podendo s2 ser uma constante. f) Copiando parte de uma string. Pode-se copiar os n primeiros caracteres de uma string atravs da funo char *strncpy(char *s1, char *s2, int n); que armazena em s1 os n primeiros caracteres de s2, podendo este segundo parmetro ser uma constante. necessrio observar que o caractere nulo no armazenado, devendo isto ser feito pelo programa. g) Verificando se uma string subcadeia de outra string.
Para se verificar se uma dada cadeia de caracteres est contida em outra cadeia, utiliza-se a funo
char *strstr(char *s1, char *s2); que retorna um ponteiro para a primeira posio a partir da qual s2 ocorre em s1, retornando NULL se s2 no est contida em s1. Por exemplo, a execuo do programa #include <stdio.h> #include <string.h> main(void) {
char *Str1 = "Logica de Programacao", *Str2 = "grama", *p; p = strstr(Str1, Str2); if (p != NULL) printf("A \"ultima\" substring de %s que contem %s e: %s.\n", Str1, Str2, p); else printf("%s nao esta contida em %s", Str2, Str1); } exibe na tela a afirmao:
char a[20]; c1 = strlen(s1); c2 = strlen(s2); for (i = 0; i < c1 + c2 ; i++) if (i < p) a[i] = s1[i]; else if (i < p + c2) a[i] = s2[i - p]; else a[i] = s1[i - c2]; a[i] = '\0'; strcpy(s1, a); } 3. A funo strstr() comentada acima verifica se uma string s1 est contida numa string s2 mas no retorna a posio a partir da qual s2 ocorre em s1. A funo abaixo resolve esta questo atravs da diferena dos comprimentos de s1 e da cadeia que a chamada strstr(s1, s2) retorna. int Pos(char *s1, char *s2) { char *Aux; Aux = strstr(s1, s2); if (Aux != NULL) return(strlen(s1) - strlen(Aux)); else return (-1); } 4. Com a funo strncpy() pode-se copiar os n primeiros caracteres de uma string. Considerando que um ponteiro de caracteres armazena o endereo da posio de memria do primeiro caractere da string, que as posies de memria que armazenam as componentes de um vetor so contguas e que cada varivel do tipo char ocupa um byte, se s um ponteiro do tipo char e p um inteiro, s + p ser um ponteiro que apontar para o caractere de ordem p. Assim, strncpy(s1, s2 + p, n) armazenar em s1 os n caracteres de s2 a partir da posio p. 5. A prxima funo converte uma data dada (como uma cadeia de caracteres) no formato americano mm/dd/aaaa para o formato brasileiro dd/mm/aaaa. O algoritmo usa a funo strncpy() (com a observao do exemplo anterior) para extrair o dia, o ms e o ano e a funo strcat() para concatenar na ordem pretendida. void ConverteData(char *s) { char *Dia, *Mes, *Ano; strncpy(Mes, s, 3); Mes[3] = '\0'; strncpy(Dia, s + 3, 3); Dia[3] = '\0'; strncpy(Ano, s + 6, 4); Ano[4] = '\0'; strcat(Dia, Mes); strcat(Dia, Ano); strcpy(s, Dia); } 6. Um programa que manipule datas deve possuir uma funo que verifique se a data dada era vlida. Isto no ocorreria se o valor do ms fosse maior que 12 ou que, por exemplo, se o ms fosse junho e o dia fosse 31.
int i, d, m, a, Verifica; char Dia[3], Mes[3], Ano[5]; strncpy(Dia, s, 2); Dia[3] = '\0'; strncpy(Mes, s + 3, 2); Mes[3] = '\0'; strcnpy(Ano, s + 6, 4); Ano[4] = '\0'; d = atoi(Dia); m = atoi(Mes); a = atoi(Ano); Verifica = 1; if ((m <= 12) && (m >= 1) && (d >= 1) && (d <= 31)) switch(m) { case 2: if (((a % 4 == 0) && (a % 100 != 0)) || (a % 400 == 0)) if (d > 29) Verifica = 0; else; else if (d > 28) Verifica = 0; break; case 4: case 6: case 9: case 11: if (d > 30) Verifica = 0; break; } else Verifica = 0; return(Verifica); } Vale observar que os comandos Verifica = 0 poderiam ser substitudos por return(0). Neste caso, o ltimo comando seria return(1). 7. Os compiladores C ignoram espaos em branco digitados num programa. Uma maneira de se tornar isto possvel , antes da compilao, eliminar todos os espaos em branco "suprfluos", ou seja, deixar duas palavras sempre separadas por um nico espao em branco. A funo abaixo, utilizando a funo DeletaCaracteres(), realiza tal ao.
i = i + 1; } } 8. A questo a seguir bem interessante. Trata-se de um programa que determine o dgito verificador de um nmero de uma conta corrente, de um nmero de matrcula de um estudante de uma escola, etc. O dgito verificador serve para a preveno de possveis erros de digitao. Por exemplo, se a matrcula 302457 fosse digitada erroneamente como 39245-7, o erro seria detectado, pois o dgito verificador da conta 39245 seria 6 e no 7. Existem vrios mtodos para a determinao do dgito verificador. Um deles dado pelo seguinte algoritmo:
1. Multiplica-se os nmeros correspondentes aos dgitos da conta, da direita para esquerda, por 2, por 3, etc..
2. Soma-se os produtos obtidos no item 1. 3. Determina-se o resto da diviso da soma obtida no item 2 por 11. 4. Subtrai-se de 11 o resto obtido no item 3 5. Se o valor obtido no item 4 for 10 ou 11 o dgito verificado igual a zero; seno, o dgito o valor obtido no item referido. Por exemplo, se o nmero da conta for 30245, temos 1. 5x2 = 10, 4x3 = 12, 2x4 = 8, 0x5 = 0, 3x6 = 18 2. 10 + 12 + 8 + 0 + 18 = 48 3. Resto(48, 11) = 4 4. 11 - 4 = 7 5. Dgito verificador = 7. A funo abaixo implementa este algoritmo. Observe que foi utilizado molde para converter caracteres em inteiros e vice-versa.
raiar palndroma. Escreva um programa que verifique se uma palavra dada palndroma. 2. Um dos recursos disponibilizados pelos editores de texto mais modernos a determinao do nmero de palavras de um texto. Escreva um programa que determine o nmero de palavras de um texto dado. 3. O exerccio 21 do captulo 6 solicitava um programa que convertesse um nmero dado no sistema decimal para o sistema binrio. Pela limitao do sistema em tratar nmeros inteiros, uma soluo que tratasse a converso como sendo do tipo long seria limitada. Escreva um programa para a converso citada, tratando o valor em binrio como uma cadeia de caracteres. 4. Escreva um programa que converta um nmero do sistema binrio, dado como uma cadeia de zeros e uns, para o sistema decimal de numerao. 5. Reescreva a funo apresentada no exemplo 8 deste captulo de tal modo que ele possa, alm de gerar dgitos verificadores, verificar se uma conta dada (incluindo o dgito verificador) foi digitada incorretamente, incorreo esta detectada pelo dgito verificador. 6. Os editores de texto possuem um recurso que permite o usurio substituir uma sub-cadeia de um texto por outra cadeia de caracteres. Escreva um programa que realize esta ao numa frase dada. 7. As companhias de transportes areos costumam representar os nomes dos passageiros no formato ltimo sobrenome/nome. Por exemplo, o passageiro Carlos Drumond de Andrade seria indicado por Andrade/Carlos. Escreva um programa que receba um nome e o escreva no formato acima. 8. As normas para a exibio da bibliografia de um artigo cientfico, de uma monografia, de um livro texto, etc., exigem que o nome do autor seja escrito no formato ltimo sobrenome, sequncia das primeiras letras do nome e dos demais sobrenomes, seguidas de ponto final . Por exemplo, Antnio Carlos Jobim seria referido por Jobim, A. C.. Escreva um programa que receba um nome e o escreva no formato de bibliografia. 9. muito comum que os ttulos de documentos como avisos, declaraes, atestados, etc., apaream em letras maiusculas separadas por um espao em branco. Escreva uma funo que receba uma palavra e a retorne no formato acima. 10. Escreva uma funo que gere logins para usurios de um sistema de computao baseado na seguinte regra: o login composto pelas letras iniciais do nome do usurio. Observao Propostas de solues dos exerccios propostos podem ser solicitadas atravs de mensagem eletrnica para jaime@ccen.ufal.br com assunto RESPOSTAS LIVRO C, anexando o formulrio abaixo devidamente preenchido. Nome
1 2
Categoria1
Instituio2
Curso2
Cidade/Estado