2017-09-20 4 views
0

C'est ce que j'ai essayé, ma logique est que mon tmp décaler à gauche 31 fois sera comparé à l'entier d'entrée utilisateur I et une valeur de 1 ou 0 sera insérée à l'index str[0] ->str[31] et le I null se terminent str[32] avec le \0.Conversion d'un nombre entier en chaînes binaires dans c

Cependant, j'obtiens une erreur de segmentation.

P.S. Je ne suis pas autorisé à changer les paramètres de cette fonction et mon professeur a mis la taille de str à 33 dans le principal, ce qui, je ne permets pas de changer non plus.

void int2bitstr(int I, char *str) { 
     int tmp = 1 << 31; 
     do{ 
       *str++ = !!(tmp & I) + '0'; 
     } while(tmp >>= 1); 
     *str = '\0'; 
} 
+3

'int' est signé. L'avez-vous oublié? –

+0

J'utilise toujours [Valgrind] (https://www.valgrind.org) pour comprendre les erreurs de segment –

+1

Sur la base de ce qu'Eugene a dit, je pense que vous seriez surpris de votre sortie si vous imprimez la valeur de 'tmp' sur votre console avec chaque itération, en particulier en considération de votre clause de sortie de boucle. – WhozCraig

Répondre

1

Essayez de faire un tmpunsigned int. Le comportement du décalage vers la droite d'un entier négatif (signé) est défini par l'implémentation, et dans votre cas, il est probable que le décalage se produise en 1s (MSB d'origine), provoquant ainsi la boucle à dépasser la longueur de str.

+1

'int tmp = 1 << 31;' -->' unsigned tmp = 1u << 31; '(assurez-vous de changer en' 1u') – chux

+0

Merci! Le programme fonctionne bien maintenant, je ne peux pas croire que j'oublie –