2017-09-26 2 views
0

J'essaie d'accomplir ce qui suit: donné la fonction: int f(void *p) prendre le premier octet de p et l'extrait comme un personnage. Ensuite, en fonction de ce que ce caractère est de déterminer quels octets supplémentaires à extraire en tant qu'intentions courtes. Par exemple, si j'ai un certain caractère c, extraire les octets 4 et 7 comme des nombres courts et les stocker dans des variables séparées; si j'ai un certain caractère différent d extraire les octets 3, 4, 5 et les stocker comme des variables séparées. Avec cette information, exécutez un autre code non pertinent. J'ai lutté avec ça pendant des heures.extrait d'un caractère et divers ints court du même pointeur vide dans C

J'ai essayé les éléments suivants:

int f(void *p) { 
    char *first = &p; 
    short int *third = p + 2; 
    short int *fifth = p + 4; 
    short int *seventh = p + 6; 
    printf("%s %s %s, %s", first, third, fifth , seventh); 

} 

int main(int argc, char const *argv[]) { 
    char test[] = "*5431234567"; 
    f(test); 

} 

Mon résultat: ▒▒ς -1295010922 -1295010920, -1295010918

attendu: * 4 1 3

Après un certain temps je me suis rendu J'essayais de décoder un pointeur vide qui ne fonctionne pas. J'ai donc essayé de lancer:

char* c = (char*) p; 
char first = (char) (*c) 
printf("%s", first); 

Cela m'a donné un défaut seg.

J'ai essayé des choses similaires avec le court métrage int sans résultat. Si c'est une question un peu noobish je m'excuse. Je suis nouveau à C et tout le concept des pointeurs et des références est nouveau pour moi. Ma première langue était Java, qui est beaucoup plus indulgent.

+2

Vous ne pouvez pas effectuer d'opérations arithmétiques sur un pointeur 'void'. – jxh

+0

Pourquoi ne pas avoir 'f' juste prendre un paramètre' char * ', puisque c'est ce que vous lui passez? – aschepler

+0

Formellement, vous ne pouvez pas faire d'arithmétique sur un 'void *'. Malheureusement, GCC n'applique pas cela, et traite un «void *» comme étant à peu près équivalent à un «char *» quand il s'agit de l'arithmétique du pointeur, –

Répondre

1
char *first = &p; 

Débarrassez-vous du &. Vous ne voulez pas l'adresse de la variable p, vous voulez l'adresse stockée dans il, qui est simplement p.

char *first = p; 

short int *third = p + 2; 
short int *fifth = p + 4; 
short int *seventh = p + 6; 
printf("%s %s %s, %s", first, third, fifth, seventh); 

Il n'y a pas de raison d'être à l'aide short pointeurs. Les éléments d'une chaîne sont char s, et non short s. Même quand ils sont des chiffres, ils sont toujours char s.

Laissez-les sous char s, passez à %c pour les imprimer et assurez-vous de déréférencer les pointeurs lorsque vous le faites.

char *third = p + 2; 
char *fifth = p + 4; 
char *seventh = p + 6; 
printf("%c %c %c %c\n", *first, *third, *fifth, *seventh); 
+0

J'ai fait une erreur petite mais significative que je voulais dire pour printf ("% s% s% s,% s", premier, troisième, cinquième, septième); être printf ("% s% i% i,% i", premier, troisième, cinquième, septième); Pardon. –

3

Votre entrée est une chaîne, et votre sortie attendue sont des caractères individuels dans la chaîne. Il n'y a rien short int -comme à propos de ce problème.

char *s = p; 
printf("%c %c %c, %c", s[0], s[2], s[4] , s[6]); 

Si vous devez stocker ces valeurs dans les variables short int, alors vous n'avez pas besoin des pointeurs.

short int x = s[2] - '0'; 
short int y = s[4] - '0'; 
short int z = s[6] - '0'; 

printf("%c %hd %hd %hd\n", s[0], x, y, z); 

Les caractères qui représentent les chiffres décimaux sont garantis pour être contiguës, vous pouvez donc calculer la valeur ordinale en calculant le décalage par rapport '0'.

+0

whoops je voulais dire pour printf ("% s% s% s,% s", premier, troisième, cinquième, septième); être printf ("% s% i% i,% i", premier, troisième, cinquième, septième); –

+0

@ SamK9: '% i' et'% d' sont identiques pour 'printf'. Mais, votre entrée ne consiste pas en entiers. Votre entrée est une chaîne et votre sortie attendue correspond aux caractères de la chaîne. – jxh

+0

oui mais j'ai besoin de les convertir en nombres courts afin que je puisse faire des opérations mathématiques avec eux –