2010-06-01 8 views
0

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

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 copier à

finale [0] = a aléatoire omble final [1] = char aléatoire final [2] et final [3] = le tableau court final [4] = autre omble chevalier ....

Mon problème est que je veux copier le deux octets de l'int court à 2 octets du tableau final.

merci.

Répondre

5

Je suis confus - le problème est que vous dites strlen(dest)+6 qui limite la longueur de la chaîne final à 10 caractères (plus un terminateur nul). Si vous dites strlen(dest)+8 alors il y aura assez 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. Cela signifie qu'il faut jusqu'à 5 octets d'espace pour écrire un court-circuit sur une chaîne, si vous écrivez un nombre supérieur à 10000.

Maintenant, si vous écrivez le raccourci d'une chaîne sous la forme d'un nombre hexadécimal à l'aide du %x spécificateur de format, il ne prendra pas plus de 2 octets.

+0

Je souhaite ajouter 4 octets (4 caractères) et 2 autres pour un entier court, c'est-à-dire 6 caractères – cateof

+0

@cateof: Mais votre entier court peut utiliser jusqu'à 5 caractères (octets) lorsqu'il est formaté en tant que chaîne. Il utilise 3 dans ce cas (500). –

+2

@cateof Vous avez oublié le caractère NULL, et lorsque vous convertissez votre court-circuit en chaîne, il devient "500", ce qui fait trois caractères et prend trois octets. Je crois que le maximum court est 32767, donc vous devriez laisser cinq octets d'espace pour être sûr que ça va aller –

1

Vous devez allouer de l'espace pour 13 caractères - pas 11. N'oubliez pas la valeur NULL.

1

Vous perdez un octet car vous pensez que la variable courte prend 2 octets. Mais il faut trois: un pour chaque caractère ('5', '0', '0'). Vous avez également besoin d'un terminateur '\0' (+1 octet).

==> Vous devez strlen(dest) + 8

+0

un, ok. C'est le problème. Donc j'ai besoin de l'essayer à nouveau. Je veux créer un tableau de caractères qui contient 1er octet = char aléatoire 2ème octet = un ramdom ombles 3ème et 4ème octet = un court int 5ème octet = char aléatoire. Alors, comment puis-je copier l'int court vers un tableau d'octets? – cateof

+0

Il est préférable de clarifier votre question pour refléter ces exigences mises à jour. – jmanning2k

1

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

Apparemment, vous devez 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); 
0

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

Lorsque formaté le nombre (500) reprend trois espaces, pas un. Donc, votre snsprintf devrait donner la longueur finale strlen(dest)+5+3. Ensuite, réparez votre appel malloc pour ajuster. Si vous voulez calculer le strlen du nombre, faites-le avec un appel comme ceci strlen(itoa(val)). De plus, je ne peux pas oublier la valeur NULL à la fin de dest, mais je pense que strlen en tient compte, mais je ne suis pas certain.

1

La réponse simple est que vous avez seulement alloué assez d'espace pour le strlen (dest) + 6 caractères quand en réalité il semble que vous allez avoir 8 caractères supplémentaires ... puisque vous avez 2 caractères + 3 caractères dans votre nombre + 2 caractères après + dest (5 caractères) = 13 caractères lorsque vous avez attribué 11 caractères.

0

On dirait que le malentendu principal est qu'un court-circuit de "2 octets" ne peut pas être représenté à l'écran sous forme de 2 caractères de 1 octet.

Tout d'abord, laisser assez:

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

La gamme de 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 que 4 octets hexadécimaux 2 octets, 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, c'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 qui n'a pas de sens à une recherche humaine, et est sensible à boutisme. Je recommanderais fortement contre.

+0

Autre avertissement: l'instruction snprintf d'octets bruts ne fonctionne que pour un int * short non signé. – jmanning2k

Questions connexes