Question

Je n'utilise pas correctement le format spécificateurs C. Quelques lignes de code:

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;
}

Ce que je veux est de copier à

finale [0] = a car.aléatoire définitif [1] = a car.aléatoire finale [2] et finale [3] = le réseau court finale [4] = autre carbonisation ....

Mon problème est que je veux copier les deux octets de court int 2 octets du tableau final.

Merci.

Était-ce utile?

La solution

Je suis confus - le problème est que vous dites strlen(dest)+6 qui limite la longueur de la chaîne de final à 10 caractères (plus une terminaison null). Si vous dites strlen(dest)+8 alors il y aura suffisamment d'espace pour la chaîne complète.

Mise à jour

Même si une courte ne peut être 2 octets, lorsqu'il est imprimé sous forme de chaîne chaque caractère prendra un octet. Donc, cela signifie qu'il peut nécessiter jusqu'à 5 octets d'espace pour écrire un court à une chaîne, si vous écrivez un nombre supérieur à 10000.

Maintenant, si vous écrivez court à une chaîne comme un nombre hexadécimal en utilisant le spécificateur de format %x, il prendra plus de 2 octets.

Autres conseils

Vous devez allouer de l'espace pour 13 caractères -. Pas 11. Ne pas oublier les NULL de terminaison

Lorsque le nombre formaté (500) occupe trois espaces, et non pas une. Ainsi, votre snsprintf devrait donner la longueur finale strlen(dest)+5+3. Fixez ensuite également votre appel malloc à régler. Si vous voulez calculer la strlen du nombre, faire avec un appel comme celui-ci strlen(itoa(val)). En outre, cant oublier la valeur NULL à la fin de dest, mais je pense que strlen prend cela en compte, mais je ne suis pas sûr.

La réponse est simple, vous est que suffisamment d'espace alloué pour les strlen (DEST) + 6 caractères quand dans toute réalité, il semble que vous allez avoir 8 caractères supplémentaires ... puisque vous avez 2 CHARS + 3 caractères dans votre numéro + 2 caractères après + Dest (5 caractères) = 13 carbonisation lorsque vous attribué 11 caractères.

Unsigned shorts peut prendre jusqu'à 5 caractères, non? (0 - 65535)

On dirait que vous auriez besoin d'allouer 5 caractères pour votre unsigned short pour couvrir toutes les valeurs.

qui laisseraient penser à utiliser ceci:

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

Vous perdre un octet parce que vous pensez que la variable courte prend 2 octets. Mais il faut trois: un pour chaque caractère de chiffre ( « 5 », « 0 », « 0 »). vous devez également une terminaison de '\0' (1 octet).

==> Vous avez besoin strlen(dest) + 8

Utilisation 8 au lieu de 6 sur:

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

et

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

semble que le malentendu primaire est qu'un court « de 2 octets » ne peut pas être représenté à l'écran comme 2 caractères à 1 octet.

Tout d'abord, laissez assez:

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

Toute la gamme des valeurs possibles pour un caractère de 1 octet ne sont pas imprimables. Si vous souhaitez afficher cet écran et être lisible, vous devrez encoder court 2 octets que 4 octets hex, tels que:

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

Si vous écrivez à un fichier, qui est OK, et vous pouvez essayer ce qui suit:

## 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); 

Mais cela ne toucherez pas à un sens humain à la recherche, et est sensible à boutisme. Je recommande fortement contre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top