[eside-ghost] Resumen de eside-ghost, Vol 576, Envío 1
Álvaro Morán
nirvana644 en gmail.com
Dom Abr 18 21:05:08 CEST 2010
Gracias, con lo que me dijiste ya lo solucioné, recurrí al truco:
/* funciona con los carácteres latinos del castellano y francés */
#include <ctype.h>
#include <stdio.h>
#define STRINGMAX 100
int main(void)
{
char nombre[STRINGMAX];
int c, i, suma = 0, nombreint[STRINGMAX -1];
int tamNombre=0; // esta variable se usará para guardar el tamaño del
nombre sin contar el caracter '\0'
printf("\n¡Hola! ¿Cuál es su nombre? ");
for(i=0; (c=getchar()) != '\n'; i++) {
// printf("Valor de i= %d", i);
nombreint[i]=c;
nombre[i] = c;
if(isalpha(c))
suma += nombreint[i];
else if((i!=0) && (nombreint[i-1] == 195))
suma += nombreint[i];
}
// printf("Valor de i= %d", i);
nombre[i] = '\0';
tamNombre = i;
int nombreReves[STRINGMAX -1];
/*printf("\nArray de int original: ");
for(i=0; i<tamNombre; i++)
printf("%3d ", nombreint[i]);*/
for(i=0; i< tamNombre; i++) {
//printf("\nEl caracter a tratar y el siguiente %3d %3d\n", nombreint[
tamNombre -i -1],nombreint[ tamNombre -i -2]);
if(nombreint[tamNombre -i -2] != 195)
nombreReves[i] = nombreint[tamNombre -i -1];
else
{
nombreReves[i] = nombreint[tamNombre -i -2];
nombreReves[i+1] = nombreint[tamNombre -i -1];
i++;
}
}
/*printf("\nArray de int reves: ");
for(i=0; i<tamNombre; i++)
printf("%3d ", nombreReves[i]);
printf("\n");
*/
printf("%s%s\n","Encantado de conocerle: ", nombre);
for(i=0; i<tamNombre; i++)
nombre[i] = nombreReves[i];
nombre[i] = '\0';
printf("%s%s\n","Su nombre deletreado al revés es: ", nombre);
//for(i=tamNombre; i>=0; --i)
// printf("\n%d ",nombre[i]);
printf("\n%s%d%s\n\n%s\n",
"y las letras en su nombre suman ", suma, ".",
"¡Qué tenga un buen día!");
return 0;
}
El 13 de abril de 2010 12:00, <eside-ghost-request en listas.deusto.es>escribió:
> Envíe los mensajes para la lista eside-ghost a
> eside-ghost en listas.deusto.es
>
> Para subscribirse o anular su subscripción a través de la WEB
> https://listas.deusto.es/mailman/listinfo/eside-ghost
>
> O por correo electrónico, enviando un mensaje con el texto "help" en
> el asunto (subject) o en el cuerpo a:
> eside-ghost-request en listas.deusto.es
>
> Puede contactar con el responsable de la lista escribiendo a:
> eside-ghost-owner en listas.deusto.es
>
> Si responde a algún contenido de este mensaje, por favor, edite la
> linea del asunto (subject) para que el texto sea mas especifico que:
> "Re: Contents of eside-ghost digest...". Además, por favor, incluya en
> la respuesta sólo aquellas partes del mensaje a las que está
> respondiendo.
>
>
> Asuntos del día:
>
> 1. Re: Problemas C (Alvaro Uría)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Mon, 12 Apr 2010 14:07:28 +0200
> From: Alvaro Uría <fermat en rigel.deusto.es>
> Subject: Re: [eside-ghost] Problemas C
> To: Lista de eside-ghost <eside-ghost en listas.deusto.es>
> Message-ID: <4BC30D00.2020905 en rigel.deusto.es>
> Content-Type: text/plain; charset=ISO-8859-1
>
> Aupi,
>
> El 06/04/10 22:14, Álvaro Morán escribió:
> > Hola,
> > soy un novato en esto de C y tenía un problema con los caracteres no
> ASCII.
> > con un programa tan simple como este:
>
> Los caracteres unicode utilizan 2 bytes. Por eso, cuando escribes un
> carácter (1 byte, usando "%c" en un printf, o con el putchar), te sale
> un "dibujo".
>
> Una posible solución (bastante cutre) es meter esos caracteres unicode
> (que son valores int negativos) en un string.
>
> Te escribo los posibles cambios:
> --- prueba.c.orig 2010-04-12 13:46:49.000000000 +0200
> +++ prueba.c 2010-04-12 13:47:13.000000000 +0200
>
> +#include <stdlib.h> /* para malloc y free */
>
> - int i, suma = 0;
> + int i, suma = 0, j;
>
> - for(i=0; (c=getchar()) != '\n'; ++i) {
> + for(i=0; (c=getchar()) != '\n' && i<STRINGMAX-1; ++i) { /* para
> evitar buffer overflow */
>
> - for(--i; i>=0; --i)
> - putchar(nombre[i]);
> +
> + char *sbuf = malloc(3); /* reserva de 3 bytes = 2 chars + '\0' */
> + if (sbuf == NULL)
> + return 1;
> +
> + for(j=i-1; j>=0; --j) { /* escribe el string al reves */
> + if (nombre[j] < 0 && j > 0) {
> + snprintf(sbuf, 3, "%c%c", nombre[j-1], nombre[j]);
> + fprintf(stdout,"%s", sbuf);
> + --j; /* para saltarse ambos chars */
> + } else {
> + fprintf(stdout, "%c", nombre[j]);
> + }
> + }
> +
> + if (sbuf != NULL) free(sbuf);
>
>
> > me doy cuenta de que al introducir mi nombre, Álvaro, en el printf que
> > imprime el nombre el carácter acentuado se muestra correctamente pero no
> con
> > el putchar. Si intento por probar hacer un *putchar('\u00C1'); *el
> > compilador gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) me dice:
> > *$ gcc -Wall -Wstrict-prototypes nice_day2.c -o niceDay2.out*
> > *nice_day2.c:35:13: warning: universal character names are only valid in
> C++
> > and C99*
> [...]
> > Y mi pregunta es ¿Hay alguna alternativa al putchar? ¿O hay algún modo de
> > compilar los programas en C en el modo C99 y que funcionen?
>
> El soporte C99 en GCC no está completo, y creo que el tema de wchar.h
> (putwchar, etc.) falta.
>
> Lo suyo sería usar el compilador de C++.
>
> Saludos,
> Alvaro.
>
>
> ------------------------------
>
> _______________________________________________
> eside-ghost mailing list
> eside-ghost en listas.deusto.es
> https://listas.deusto.es/mailman/listinfo/eside-ghost
>
> Fin de Resumen de eside-ghost, Vol 576, Envío 1
> ***********************************************
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: https://listas.deusto.es/mailman/private/eside-ghost/attachments/20100418/01f14a7d/attachment.htm
Más información sobre la lista de distribución eside-ghost