[eside-ghost] Problemas C

Alvaro Uría fermat en rigel.deusto.es
Lun Abr 12 14:07:28 CEST 2010


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.


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