2009-11-15 12 views
6

Tengo un problema, construyo una cadena en un bucle y la salida de esa cuerda a stout muestra la cadena y un carácter 'y' con dos puntos encima como el último carácter.¿Qué significa 'y' en la salida en C?

¿Qué es eso?

que crear la cadena en esta función:

char get_string(char *buf, int ble, FILE *fp, char del) 
{ 
    int i = 0; 
    int c; 
    char result; 

    memset(buf, 0, BUFLEN); 

    do { 

     c = fgetc(fp); 

     if (c == del) { 
      buf[i] = '\0'; 
      result = c; 
      break; 
     } else if(c == '\n') { 
      buf[i] = '\0'; 
      result = '\n'; 
      break; 
     } else { 
      buf[i] = c; 
      i++; 
     } 

    } while (c != EOF); 

    return result; 
} 

y luego usar el buf y el resultado de la siguiente manera en otra función:

char pair[BUFLEN]; 
char end; 

do { 

     end = get_string(pair, BUFLEN, fp, ';'); 
     printf("Result: %s\n",pair); 

} while (pair != NULL); 

La última iteración de las impresiones anteriores a cabo "Resultado: y "No tengo idea por qué.

+0

¿Puedes publicar tu código? – cschol

+0

Agregué mi código – goe

Respuesta

8

Y es el glifo para el carácter que (en Unicode y muchos ISO-8859-? Codificaciones) tiene el valor 0xFF ordinal. Ese valor, también conocido en decimal como 255, también se utiliza en algunos contextos como "el carácter de fin de archivo" (también conocido como EOF) - aunque no hay un estándar que define el carácter como tal (que yo sepa), el valor -1 es lo que se devuelve en muchos idiomas (como C) cuando intenta leer más de un archivo que está agotado ("al final del archivo").

En la práctica, por lo tanto, un unexpected inesperado en su salida a menudo significa que está interpretando erróneamente un byte que significa "fin de algo" (un byte codificado con todos los bits establecidos en uno) como si fuera parte de el texto para mostrar

+0

Gracias, que funcionó – goe

+0

Pequeño nitpick - es el glifo para el punto de código Unicode 'U + 00FF', que en UTF-8 corresponde al byte' 0xFF'. –

+0

@Jesse, en Unicode se puede escribir U + 00FF (que tiene el valor ordinal 255 en decimal, FF en hexadecimal, etc.), en ISO-8859-1 (& c) por supuesto no se puede escribir con un ' Prefijo U '(mientras que 0xFF sigue siendo correcto ;-), y este punto de código en UTF-8 está codificado como una secuencia de DOS bytes, 0xC3 0xBF, que no tiene nada que ver con el problema del OP. –

1

Cuando se "construye su cadena en un bucle", ¿recuerda a terminar correctamente con un '\0'?

Si el bucle asigna caracteres a una matriz de caracteres, el último elemento de la matriz debe ser '\0'.

Ok, después de ver el código, que están terminando la cadena.

EDITAR:

Parece que va a incluir el carácter EOF en su cadena. Este es un caso donde la cadena no termina adecuadamente. Debería verificar si hay un EOF en su estructura if-else y manejarlo correctamente.

Otra cosa que he notado:

está asignando un int c a un char result, al regresar de su función. El compilador debería haberle advertido que está tratando de poner un tipo de datos más grande en un tipo de datos más pequeño. Dependiendo de cuál sea el propósito del valor de retorno, pensaría en cambiar el tipo de datos de devolución a int.

+0

Sí, creo, mire arriba. – goe

2

'y' con dos puntos sobre él es el carácter 0xFF (en latín-1 - la página de códigos predeterminada de la consola).

0xFF como un valor de 8 bits con signo es -1.

buscar lugares donde se están imprimiendo -1 como un char (o utilizando -1 como un char y luego imprimirlo).

9

Usted está utilizando un do - bucle while, lo que significa que se está ejecutando el cuerpo del bucle antes de la prueba para EOF, por lo que terminan poniendo EOF en su memoria intermedia también. El valor de EOF de -1 se traduce al rango de caracteres donde corresponde a ÿ. Te recomendaría que simplemente cambies a un bucle while más habitual porque maneja esta condición de forma más natural.

1

Su if -statement, que termina con una persona que pone el carácter en el búfer tiene dos defectos:

  1. No filtrar el EOF "carácter" especial, que significa el final de la corriente
  2. No comprueba el desbordamiento del búfer comparando i con el valor BUFLEN.

El primer problema es la causa de su carácter,, cuando termina la secuencia, agrega el carácter EOF al búfer, luego termina el bucle.

La solución es poner una cláusula en su estado de cuenta if-else a filtrar esa distancia, así:

} else if (c != EOF) { 
    buf[i] = c; 
    i++; 
} 

El segundo problema tiene que decidir cómo manejar antes de fijar, pero debe fijarse .

0

No termina correctamente la cadena. Si lee desde fp nunca devuelve "del" o "\ n" y llega a EOF, no habrá un terminador nulo. Necesitas arreglar tu código.