Pregunta

No uso correctamente los especificadores de formato en C. algunas líneas de código:

int main()
{
        char dest[]="stack";
        unsigned short val = 500;
        char c = 'a';

        char* final = (char*) malloc(strlen(dest) + 6);

        snprintf(final, strlen(dest)+6, "%c%c%hd%c%c%s", c, c, val, c, c, dest); 

        printf("%s\n", final);
        return 0;
}

Lo que quiero es copiar en

final [0] = un char final aleatorio [1] = un char final aleatorio [2] y final [3] = la matriz corta final [4] = otro char ...

Mi problema es que quiero copiar los dos bytes del corto int a 2 bytes de la matriz final.

Gracias.

¿Fue útil?

Solución

Estoy confundido, el problema es que estás diciendo strlen(dest)+6 que limita la longitud del final Cadena a 10 caracteres (más un terminador nulo). Si usted dice strlen(dest)+8 Entonces habrá suficiente espacio para la cadena completa.

Actualizar

A pesar de que un corto puede tener solo 2 bytes de tamaño, cuando se imprime como una cadena, cada personaje ocupará un byte. Eso significa que puede requerir hasta 5 bytes de espacio para escribir un corto a una cadena, si está escribiendo un número superior a 10000.

Ahora, si escribe el corto en una cadena como un número hexadecimal usando el %x Formato Especificador, no ocupará más de 2 bytes.

Otros consejos

Debe asignar espacio para 13 caracteres, no 11. No olvide el nulo de terminación.

Cuando está formateado, el número (500) ocupa tres espacios, no uno. Entonces tus snsprintf debería dar la longitud final como strlen(dest)+5+3. Entonces también arregla tu malloc Llame para ajustar. Si quieres calcular el strlen del número, haz eso con una llamada como esta strlen(itoa(val)). Además, no puedo olvidar al nulo al final de Dest, pero creo que Strlen tiene esto en cuenta, pero no estoy seguro.

Respuesta simple es que solo asignó suficiente espacio para el Strlen (Dest) + 6 caracteres, cuando en realidad, parece que tendrá 8 caracteres adicionales ... ya que tiene 2 caracteres + 3 caracteres en su número + 2 caracteres Después de + Dest (5 caracteres) = 13 char cuando asignó 11 caracteres.

Unsigned shortS puede tomar hasta 5 caracteres, ¿verdad? (0 - 65535)

Parece que necesitarías asignar 5 caracteres para tu unsigned short Para cubrir todos los valores.

Lo que apuntaría a usar esto:

char* final = (char*) malloc(strlen(dest) + 10);

Pierdes un byte porque crees que la variable corta toma 2 byte. Pero se necesitan tres: uno para cada carácter de dígito ('5', '0', '0'). También necesitas un '\0' Terminator (+1 byte).

==> necesitas strlen(dest) + 8

Use 8 en lugar de 6 en:

char* final = (char*) malloc(strlen(dest) + 6);

y

snprintf(final, strlen(dest)+6, "%c%c%hd%c%c%s", c, c, val, c, c, dest);

Parece que el malentendido principal es que un corto "2 bytes" no se puede representar en la pantalla como 2 caracteres de 1 byte.

Primero, deja suficiente espacio:

char* final = (char*) malloc(strlen(dest) + 9);

El rango completo de valores posibles para un carácter de 1 byte no es imprimible. Si desea mostrar esto en la pantalla y ser legible, tendrá que codificar los 2 bytes cortos como 4 bytes hexagonales, como:

## as hex, 4 characters
snprintf(final, sizeof(final), "%c%c%4x%c%c%s", c, c, val, c, c, dest);

Si está escribiendo esto en un archivo, está bien, y puede intentar lo siguiente:

## print raw bytes, upper byte, then lower byte.
snprintf(final, sizeof(final), "%c%c%c%c%c%c%s", c, c, ((val<<8)&0xFF), ((val>>8)&0xFF), c, c, dest); 

Pero eso no tendrá sentido para un humano que lo mira, y es sensible a la endianness. Recomiendo encarecidamente contra eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top