[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