[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