Peut chaînes être utilisé comme un index de tableau?
Peut être une chaîne de caractères utilisé comme index de tableau en C?
Ex:
Chaîne de valeur Correspondante
"UN" 1
"DEUX" 2
"CINQ" 5
"DIX" 10
Lorsqu'une chaîne dans la liste ci-dessus est transmis à la fonction, la fonction doit retourner la valeur correspondante indiquée ci-dessus. Cela peut-il être atteint par la déclaration d'une constante tableau avec de la ficelle que l'indice de
int *x;
x["ONE"] = 1;
x["TWO"] = 2;
x["FIVE"] = 5;
x["TEN"] = 5;
return x["string received by the function"];
La logique ci-dessus ne fonctionne pas comme prévu; est-il une solution pour mettre en œuvre la logique ci-dessus afin d'avoir une chaîne-tableau indexé?
Je soupçonne que c'est une maison mission: écrire une fonction qui prend une chaîne de caractères contenant une représentation littérale d'un nombre dans l'intervalle 1..10 et retourne un entier correspondant, utiliser des tableaux, n'est-ce pas?
OriginalL'auteur | 2009-01-06
Vous devez vous connecter pour publier un commentaire.
Il peut compiler, mais il ne fonctionne pas.
Ce n'est pas tout à fait clair ce que vous essayez d'atteindre. Je pense que vous voulez un tableau associatif, dans ce cas, vous devriez trouver une bibliothèque de leur mise en œuvre.
Si vous êtes à la recherche de quelque chose de plus comme un type énuméré, et vous pouvez compter sur C89, regardez quelque chose comme:
Si vous ne pouvez pas compter sur C89, alors vous devriez essayer quelques
typedef
la ruse.OriginalL'auteur Hank Gay
Il y a d'autres excellentes réponses aux questions que vous devriez faire, alors j'ai pensé que je voudrais vous expliquer ce que vous faites et pourquoi c'est de la compilation et ne travaille pas.
En C, un tableau de référence se fait en ayant un tableau ou un pointeur et un entier quelconque. (x[1], x est la matrice et 1 est le nombre entier). Tant que vous êtes en utilisant un certain type intégral, il va fonctionner comme prévu.
Supposons que vous avez quelque chose qui n'est pas un entier. Dans ce cas, l'implémentation C va voir si il peut convertir le type approprié, de sorte que vous vous retrouvez avec tableau et entier. C'est des cas comme ça où vous avez des ennuis (et un peu plus sophistiqués, dans C++ ont confondu des personnes plus expérimentées que vous).
En C, une chaîne de caractères comme "l'un" est de type const char *, ce qui signifie pointeur de caractères, vous ne pouvez pas changer. La valeur réelle est l'adresse mémoire de l'endroit où la chaîne réside effectivement dans la mémoire. Normalement, vous devriez payer aucune attention à cette valeur de pointeur, et de regarder la chaîne de valeur, mais il y a un chat ici.
En C, toute pointeur de données peut être converti en une sorte de entier, et sera automatiquement. Donc, vous avez une chaîne comme "un", et sa valeur est le nombre qui représente l'adresse de la mémoire. Lorsque C s'attend à une certaine sorte de entier, et elle peut être converti en une valeur intégrale ou autres.
Donc, c'est ce qui se passe avec x["UN"]. Le système de C a pour mettre la chaîne "UN" quelque part dans la mémoire, et il n'importe pas où. Il est susceptible d'être quelque part avec une assez grande adresse de mémoire, très probablement dans la des milliards. Quand il voit x["UN"], il essaie de convertir cette valeur en nombre entier, et l'utilise comme un indice. Donc, vous essayez d'accéder à la matrice x, de loin, bien au-delà de ses limites, et qui est à l'origine du problème. Soit vous essayez d'utiliser de la mémoire, vous n'êtes pas autorisé à, et le système s'arrête juste vous, ou que vous soyez à coucher avec un morceau de souvenir, vous devez laisser seul, et il est susceptible de faire échouer dans une manière mystérieuse, plus tard.
OriginalL'auteur David Thornley
Vous devez écrire une fonction qui mappe des chaînes de nombres entiers, ou encore utiliser les énumérations dans l'ensemble (et puis peut-être une fonction que les cartes de valeurs énumérées à cordes).
En général, il est plus agréable de faire la dernière: pour passer des entiers, de sorte que la mise en œuvre ne dépend pas de l'détails de chaînes de caractères qui peuvent être utilisés dans la représentation. Par exemple, pensez à comment vous allez gérer la localisation (traduction) si jamais vous avez besoin de faire ces chaînes acceptable pour quelqu'un parlant une langue différente.
OriginalL'auteur Martin Carpenter
Vous pouvez facilement construire des tables de recherche avec la fonction
bsearch()
fournis parstdlib.h
. Un exemple de travail est ceci:Fonctionne très bien avec mingw-gcc 3.4.5 et actuel tinyCC sur winXP - système/compilateur que vous utilisez?
Quelqu'un a elese essayé et obtenu un core dump? Ne pouvez pas réparer si je ne sais pas si c'est cassé ou pas...
OriginalL'auteur Christoph
Ce que vous cherchez est probablement l'équivalent d'un tableau associatif qui ne peuvent pas être fournis avec le même sucre syntaxique en C malheureusement sans certains idiot résultats.
Cependant, ce que vous pouvez offrir est un hashmap si vos données est conforme à la clé -> valeur des paires. Ce que vous aurez besoin est un idéal de fonction de hachage.
Il y a un décent exemple simple d'une table de hachage ici:
http://www.cl.cam.ac.uk/~cwc22/hashtable/
OriginalL'auteur Philip Reynolds
Comme déjà indiqué, vous avez besoin d'un tableau associatif ou de hachage de la carte ou équivalent. Une source possible pour ce type de code est Hanson "C Interfaces et Implémentations" (code à Google Code - double-vérifier les conditions de délivrance des permis de etc avant de l'utiliser.)
OriginalL'auteur Jonathan Leffler
C'est un vieux thread, mais j'ai pensé que cela pourrait encore être utile pour ceux qui sont à la recherche pour une mise en œuvre. Il ne prend pas trop de code; j'ai fait le mien en ~100 lignes de sans supplément de la bibliothèque comme Hank Gay suggéré. Je l'ai appelé un dictionnaire car elle est parallèle à (un peu) le python de type de données. Voici le code:
Malheureusement, vous ne pouvez pas reproduire la liste[x] la syntaxe, mais c'est la meilleure alternative que j'ai trouvé.
OriginalL'auteur 2.71828-asy
En brut "C", vous pouvez imiter à l'aide d'une chaîne de caractères comme un indice, mais pas TOUT à fait dans la manière dont vous semblez vouloir. Cependant, c'est rarement utile et surtout une excellente façon de faire votre code illisible. Ce que vous semblez vouloir est d'être en mesure d'utiliser des clés de chaîne dans un dictionnaire (ou "table de hachage", si vous préférez) et il n'y a pas intégré dans la structure de données pour que, dans C. Le modèle exact dépendra de ce que vous voulez (et, en effet, si cela fait partie des devoirs à la maison, vous pouvez même pas besoin d'utiliser un véritable table de hachage de la mise en œuvre, mais pourrait probablement vous en sortir avec moins performant statique de codage).
Un exemple à l'aide d'une chaîne de caractères (OK, un char array) dans la "position d'index) d'un[b] construire:
Ci-dessus est, autant que je peux dire, juridique C, avec un système bien défini de sortie (la chaîne "Tss ssi"). Il s'appuie sur le fait qu'un[b] est défini pour être le même que *(a+b).
x[str]
est le même questr[x]
si l'on est un pointeur et de l'autre un nombre entier pourrait être intéressant, mais n'a rien à voir avec la question...En fait, il a beaucoup à voir avec la question (en particulier, oui, vous POUVEZ utiliser une chaîne comme un indice, mais pas de la manière évidente qu'à l'origine le demandeur veut).
OriginalL'auteur Vatine