[eside-ghost] Resumen de eside-ghost, Vol 576, Envío 1

Jon Valdés juanval en gmail.com
Lun Abr 19 00:30:33 CEST 2010


Me ha intrigado el asunto este de tratar con caracteres jartos en consola.

He estado probando un poco y esto, al menos en mi ordenador, funciona
guay y es mucho más corto que tu solucion anterior

(El valor 127 es un tanto ad-hoc, no he comprobado que sea correcto)

Un saludoo

----------------------------------------->8-----------------------------------------
#include <string.h>
#include <stdio.h>

void swap(char *i ,char *j)
{
	char t = *i;
	*i=*j;
	*j=t;
}


int main(void)
{
	char nombre[256];
	printf("\n¡Hola! ¿Cual es su nombre?:");
	scanf("%s",nombre);

	printf("\nEncantado de conocerle: %s\n", nombre);

	int i, tamNombre=strlen(nombre);

	// Damos la vuelta a los caracteres dobles antes de darle la vuelta
al array entero
	for(i=0; i<tamNombre-1; i++)
		if(nombre[i]>127)
			swap(&nombre[i],&nombre[i+1]);
	
	for(i=0; i<tamNombre/2; i++)
		swap(&nombre[i],&nombre[tamNombre-i-1]);

	printf("Su nombre deletreado al revés: : %s\n", nombre);

	return 0;
}
-----------------------------------------8<-----------------------------------------



2010/4/18 Álvaro Morán <nirvana644 en gmail.com>:
> 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
>> ***********************************************
>
>
> _______________________________________________
> eside-ghost mailing list
> eside-ghost en listas.deusto.es
> https://listas.deusto.es/mailman/listinfo/eside-ghost
>


Más información sobre la lista de distribución eside-ghost