EnzoFerber
(usa FreeBSD)
Enviado em 05/06/2015 - 08:07h
Bom dia.
O que você está querendo fazer é um analisador de frequência.
Tá no caminho certo, então não vou postar códigos, só pedaços...
Primeiro,
strlen() :
for (i = 0; i < strlen(str); i++)
...
Não usamos
i <= strlen(str) para iterar sobre a string. Se você fizer isso, o último valor de
i vai apontar para o caractere NULL '\ 0' que termina toda string. E isso não é necessário.
Segundo,
switch :
Para um analisador de frequências, você não precisa utilizar um switch. É melhor utilizar um
hash . E a impletação de hashes com caracteres em C é elementar:
/* O tamanho é 255 pois a tabela ASCII possui 255 caracteres. */
int hash[255];
char *str;
...
fgets (str...);
...
/* zera os contadores do hash */
for (i = 0; i < 255; i++ )
hash[ i] = 0x0;
/* incrementa os contadores baseados nos caracteres da string */
for (i = 0; i < strlen(str); i++)
hash[ str[ i] ]++;
Uma dica: Fazer do jeito que estava fazendo (com um array de 36 elementos) é mais complicado, por causa dos condicionais que você precisara colocar e da conversão de caracteres (maiúsculos->minúsculo). Eu acho melhor utilizar o hash com 255 elementos e imprimir só os que você quer.
Uma
outra dica: os caracteres que representam números começam no index 48 (0x30). As letras maiúsculas no 65 (0x41) e as minúsculas no 97 (0x61).
Tabela ASCII:
/* c/ascii.c
* Print ASCII Table.
*
* Author: Enzo Ferber <enzoferber@gmail.com>
* Date : 05 Jun 2015
*
* Generated by: STARK Framework v1.0.5
* Module : CODE
* Version: 1.0
*/
#include <stdio.h>
int main (void)
{
register int i;
for (i = 0; i < 255; i++)
printf ("%-3d %-3x %-3c\n", i, i, i);
return 0;
}
Espero ter ajudado,
Qualquer coisa posta denovo,
Enzo Ferber
[]'s
$ cat codigo.c | indent -kr -i8
$ man indent
"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right." - linux/Documentation/CodingStyle - TORVALDS, Linus.