La conversion du type char* int
Mon code ne fonctionne pas et renvoie un très grand nombre:
#include <stdio.h>
int main()
{
char *s = "hello123";
printf("%d\n",*(int *)s);
return 0;
}
avec atoi elle retourne 0, des idées?
Ce que im essayant d'atteindre est:
par exemple im envoi "hello123" à un logiciel serveur, le serveur logiciel doit obtenir le "123" numérique dans la chaîne, ce faisant, par cette méthode:
uint16_t get_uint16(NetworkMessage *message)
{
uint16_t ret = 0;
if (!message || !message->buffer)
return 0;
ret = *(uint16_t *)(message->buffer + message->position);
message->position += sizeof(uint16_t);
return ret;
}
de quoi êtes-vous en train d'essayer d'accomplir?
Ce que la sortie ne vous attendez-vous???
pourquoi à l'aide de
en essayant d'obtenir le "123" par la position dans mon message sur le réseau (dans un autre programme)
j'attends de 123...
Ce que la sortie ne vous attendez-vous???
pourquoi à l'aide de
*(int *)s
? L'expliquer.en essayant d'obtenir le "123" par la position dans mon message sur le réseau (dans un autre programme)
j'attends de 123...
OriginalL'auteur | 2011-04-05
Vous devez vous connecter pour publier un commentaire.
Cela suppose que votre chaîne a deux parties, la première indices tenue de caractères (par exemple
hello
) et les derniers indices d'accueillir le nombre (par exemple123
). D'après ce que je comprends de votre commentaire c'est ce que tu voulais faire.Après edit : Essayer? Je suppose
message_buffer
contient votre message et est de typechar*
quel est le contenu exact de
message->buffer
?@Muggen: "hello123"
fixe, merci, j'ai voté et accepté votre réponse!
oups j'ai eu une erreur dans le code. ajouter un
-1
sur lestrlen()
ligne plz.OriginalL'auteur Muggen
Votre code ne fait pas ce que vous pensez que cela fonctionne. Vous ne pouvez pas convertir un texte en un nombre et s'attendre à le comprendre quels sont les numéros que vous voulez.
Une chaîne de caractères est un tableau de caractères, qui ont chacun une valeur ASCII. Par la coulée de
(int*)
, il prend la valeur ASCII du premier 4 caractères (4 octets pour un int) et crée un grand nombre de.Dans votre exemple, les valeurs ASCII de les 4 premiers caractères sont
{ 0x68, 0x65, 0x6c, 0x6c }
. Maintenant, vous inverser l'ordre pour little endian systèmes de{ 0x6c, 0x6c, 0x65, 0x68 }
. Vous combinez ces en0x6c6c6568
. De conversion que pour la décimale est1,819,043,176
. Qui est le nombre que vous obtenez dans votre sortie.Si vous voulez juste les 123 vous avez à l'utilisation intelligente de la chaîne d'analyse afin d'analyser la
hello
, et ensuite utiliseratoi()
sur le reste.OriginalL'auteur jonescb
Vous devez utiliser
atoi(s)
.Dans votre code, vous êtes casting de la chaîne de pointeur de pointeur entier, la lecture des quatre premiers octets d'une chaîne de caractères comme certains grands entier.
int atoi(char*)
va faire une analyse correcte, de retour de valeur de type entier.Analyse "hello123" il va s'arrêter sur le premier non des caractères numériques, et retourner la valeur 0. Vous pouvez ignorer non caractères numériques, les essais avec
int isdigit(char)
:OriginalL'auteur Goran Rakic
Tout le monde est absolument droit. Vous ne pouvez pas convertir un tableau de caractères en un entier en utilisant une fonte. Il ne fonctionne pas de cette façon. En C, les caractères sont représentés par des entiers. Lorsque vous écrivez:
Ce que vous obtenez est un tableau avec un tas de personnages. Vous pourriez écrire de manière équivalente:
Ainsi, lorsque vous appelez
printf("%d\n",*(int *)s);
, ce que vous avez à faire est de lancer à l'adresse de la mémoire de votre tableau de caractères à un pointeur sur un entier. Vous êtes alors en prenant le contenu de cet entier et de l'impression. Je suis sûr que le résultat que vous obtiendrez dépend du système que vous utilisez, mais ce n'est certainement pas ce que vous voulez.Ce que vous souhaitez faire est sans doute ce:
OriginalL'auteur LandonSchropp