Cita:
Iniciado por Alexis88 Una solución que puede mejorarse:
http://ideone.com/OyNvLA
Disculpen la poca eficiencia en el código, hace mucho que no toco C++.
Saludos
Aquí mi solución a tu código mucho más optimizada
Código C:
Ver original#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define MAX_CHARS 33 /* Letras en el diccionario. */
int main (void)
{
const char *str = "I have only right. - Tolkien.";
unsigned char dchar[MAX_CHARS] = {0};
size_t schars[MAX_CHARS] = {0};
int i, j = 0;
while ( *str != '\0')
{
if ((size_t) *str < 0x41 || (size_t) *str > 0x7A) {
str++;
continue;
}
unsigned char charlw
= tolower(*str
);
for (i = 0; i < MAX_CHARS; i++) {
if (dchar[i] == charlw)
schars[i] += 1;
else if (dchar[i] == 0) {
dchar[i] = charlw;
schars[i] += 1;
break;
}
}
str++;
}
for (; j < MAX_CHARS; j++)
if (dchar[j] != 0)
printf("Hay %i letra/as %c\n", schars
[j
], dchar
[j
]);
return EXIT_SUCCESS;
}
Un problema fundamental eran las mayúsculas y minúsculas, como podrás ver lo que hice con tolower, pero está otro problema, que no esta incluido en el código pero su solución es fácil, que trata de ASCII extendido, a lo que me refiero, si un usuario tecleó una cadena con algunas letras con tilde, no lo identificará por que aquí los estoy filtrando
Código C:
Ver originalif ((size_t) *str < 0x41 || (size_t) *str > 0x7A)
Solo quedaría ver un poco la tabla de ASCII extendido y modificar esto.
Un saludos.