Cast int en char tableau en C
Est possible de la convertir en int pour "string" dans C juste à l'aide de casting? Sans fonctions comme atoi()
ou sprintf()
?
Ce que je veux serait comme ceci:
int main(int argc, char *argv[]) {
int i = 500;
char c[4];
c = (char)i;
i = 0;
i = (int)c;
}
La raison en est que j'ai besoin de générer deux aléatoire ints (de 0 à 500) et de l'envoyer à la fois comme une chaîne de caractères dans un message de la file d'attente à un autre processus. Les autres processus reçoit le message et faire le LCM.
Je sais comment le faire avec atoi()
et itoa()
. Mais mes professeurs veut simplement à l'aide de plâtre.
Aussi, pourquoi n'est-ce pas la suite possible de compiler?
typedef struct
{
int x;
int y;
} int_t;
typedef struct
{
char x[sizeof(int)];
char y[sizeof(int)];
} char_t;
int main(int argc, char *argv[])
{
int_t rand_int;
char_t rand_char;
rand_int.x = (rand() % 501);
rand_int.y = (rand() % 501);
rand_char = (char_t)rand_int;
}
phrase-clé étant "mes professeurs veux", ce qui signifie tout ce qui suit est pour vous, pas pour nous de vous montrer. ~sourire~
Vous ne pouvez pas imaginer la quantité d'efforts, de temps et de recherche, j'ai gaspillé à essayer de le faire. Tout fonctionne bien, le casting ne marche pas.
Je répondrais que vous avez jamais perdu une seule seconde... vous avez fait exactement ce que les enseignants... vous avez passé beaucoup de temps à essayer de comprendre comment ne pas le faire. Et c'est incroyablement précieux en tant que programmeur.
Pouvez-vous partager la signature de la fonction de mise sur le message de la file d'attente? Cela sonne comme le noeud du problème.
Je comprends K Scott Piel. Donc, je peux vous dire que j'ai réalisé tout, mais la coulée de int en char de la matrice. Pouvez-vous svp m'aider? 🙂
Vous ne pouvez pas imaginer la quantité d'efforts, de temps et de recherche, j'ai gaspillé à essayer de le faire. Tout fonctionne bien, le casting ne marche pas.
Je répondrais que vous avez jamais perdu une seule seconde... vous avez fait exactement ce que les enseignants... vous avez passé beaucoup de temps à essayer de comprendre comment ne pas le faire. Et c'est incroyablement précieux en tant que programmeur.
Pouvez-vous partager la signature de la fonction de mise sur le message de la file d'attente? Cela sonne comme le noeud du problème.
Je comprends K Scott Piel. Donc, je peux vous dire que j'ai réalisé tout, mais la coulée de int en char de la matrice. Pouvez-vous svp m'aider? 🙂
OriginalL'auteur Bodosko | 2013-05-07
Vous devez vous connecter pour publier un commentaire.
Bien sûr, il n'est pas possible, car un tableau est un objet et les besoins de stockage. Jette résultat dans valeurs, pas objets. Certains diraient le point de l'ensemble d'alimentation/de C est que vous avez le contrôle sur le stockage et la durée de vie des objets.
La bonne façon de générer une chaîne de caractères contenant une représentation décimale d'un nombre entier est de créer de stockage pour vous-même et utiliser
snprintf
:OriginalL'auteur R..
Vous devez les convertir en
500
à"500"
."500"
est le même que'5'
puis'0'
puis'0'
puis0
. Le dernier élément0
est le terminateur null d'une chaîne.500
est égal à5 * 100 + 0 * 10 + 0 * 1
. Vous avez à faire un peu de maths ici. Fondamentalement, vous devez utiliser le/
opérateur.Alors que cela pourrait être utile également:
'5'
est le même que'0' + 5
.L'exigence que vous utilisez casting n'est pas pratique. C'est comme de dire à quelqu'un qu'ils ont à résoudre un problème avec une calculatrice quand ils ont déjà fait dans leur tête. Juste le résoudre sans moulage. (Bâton un mannequin casting si vous devez. Comme taper 1+1= dans la calculatrice.)
OriginalL'auteur ouah
Sans donner une exacte codé réponse, ce que vous voulez faire est de faire une boucle par chacun des chiffres d'un entier (par le calcul de son reste modulo 10 via l'opérateur%), puis ajouter sa valeur à la valeur ASCII de '0', casting le résultat d'un char, et de placer le résultat dans une chaîne se terminant par null.
Un exemple qui prétend, comme conversions implicites n'existe pas peut ressembler à ceci:
Vous pouvez déterminer la longueur de la chaîne obtenue en calculant le logarithme de base 10 du nombre, ou tout simplement de l'allouer dynamiquement en utilisant le realloc().
OriginalL'auteur CmdrMoozy
Casting est une horrible façon de le faire en raison de l'endianness, mais voici un exemple de toute façon il y a des occasions où il est utile (les syndicats à mieux travailler ces jours si, en raison de compilateur de la manipulation de ces types de distributions).
Pour un int avec une valeur <500, si l'octet le plus significatif vient d'abord, puis vous obtenez un
"chaîne de caractères"(pointeur vers un char array) "" (ou {0}), mais si le stockage est LSB (x86 est en little endian) ensuite, vous recevez un utilisable 3 octets"chaîne de caractères"char* (pas nécessairement humain caractères lisibles) mais il n'y a aucune garantie qu'il y aura un zéro octet dans un entier et depuis tout ce que vous avez est un pointeur vers l'adresse où l'int a été stocké, si vous étiez à court normal des fonctions de chaîne sur elle, ils allaient aller au-delà de la fin de l'original int dans le no-mans-land (dans les petits programmes de test, il sera souvent variables d'environnement) ... en tout cas pour plus de portabilité, vous pouvez utiliser network byte order (qui pour little endian est un no-op):Ces fonctions byteswap que nécessaire pour obtenir l'ordre des octets de réseau. Sur votre x86 ils seront optimisées à l'écart, de sorte que vous pourriez aussi bien les utiliser pour la portabilité.
OriginalL'auteur technosaurus
Juste parce que c'est pas encore inscrit: Ici un moyen de convertir les int en char tableau à taille variable de répartition en utilisant
snprintf
:OriginalL'auteur Alex