Instruction Switch à l'aide de corde sur un tableau
#include<stdio.h>
int main(){
char name[20];
printf("enter a name ");
scanf("%s",name);
switch(name[20]){
case "kevin" :
printf("hello");
break;
}
printf("%s",name);
getch();
}
Il semble que cela ne fonctionnera pas. Est-ce possible? Je veux dire, est-il possible de faire une instruction switch d'une chaîne. Comment résoudre le problème, en fait?
- Quel livre lisez-vous? Je demande cela parce que ceux qui lisent les livres n'ont généralement pas de cette question, Le livre répond. Si vous n'utilisez pas un livre comme un guide, alors vous êtes probablement une responsabilité; l'Arrêt de l'apprentissage C, et d'en apprendre un langage de programmation qui ne permet pas accidentellement se tirer dans les pieds. Sinon, procurez-vous un livre... (euh, hintedy l'astuce)
- je ne suis pas la lecture d'un livre 🙂 euh.. c la langue est notre leçon et nous avons un projet à ce sujet. ouais je veux arrêter d'apprendre ce que nous sommes juste forcé à le faire :))
- N'est-ce pas le nom[20] undefined?
Vous devez vous connecter pour publier un commentaire.
Les instructions Switch en C ne sont pas intelligents comme on en trouve dans d'autres langues (comme Java 7 ou Aller) vous ne pouvez pas passer sur une chaîne de caractères (et vous ne pouvez pas comparer des chaînes de caractères avec
==
). Commutateur peut fonctionner uniquement sur les types intégraux (int
,char
, etc).Dans votre code, vous appeler commutateur avec:
switch(name[20])
. Cela signifie queswitch(*(name + 20))
. En d'autres termes basculer le 21char
dans le nom (parce quename[0]
est le premier). Commename
a seulement 20 caractères, vous accédez à toute la mémoire après le nom. (qui pourrait faire des choses imprévisibles)Également la chaîne
"kevin"
est compilé pour unchar[N]
(oùN
eststrlen("kevin") + 1
) qui contient la chaîne de caractères. Lorsque vous necase "kevin"
. Il ne fonctionnera que si le nom est dans le même morceau de la mémoire de stockage de la chaîne. Donc, même si j'ai copiékevin
en nom. Il ne serait toujours pas de match qu'il est stocké dans une pièce différente de la mémoire.De faire ce que vous semblez vouloir vous voulez faire cela:
De comparaison de chaîne (
strcmp
) renvoie à des valeurs différentes sur la différence dans les cordes. Par exemple:Côté remarque: Ne pas utiliser
scanf("%s", name)
sous cette forme. Il crée un commune de problème de sécurité utilisationfgets
comme ceci: (il est un moyen sûr d'utiliserscanf
trop)const char *
. Les littéraux de chaîne sont des tableaux de char, et de typechar[n]
oùn
est un de plus que le nombre d'octets de la chaîne ("ABCD"
a quatre octets, de sorte qu'il serait de typechar[5]
), et lorsqu'il est utilisé dans un pointeur de contexte, ils évaluent à des pointeurs qui sont de typechar *
. Il est vrai que vous n'êtes pas autorisé à modifier leur contenu, mais pour des raisons historiques, ils n'ont pasconst
type."kevin"
est un tableauN
dechar
oùN
est égal àstrlen("kevin") + 1
, ce n'est pas vrai pour toutes les constantes de chaîne. Envisager le parfaitement valide constante de chaîne"degenerate\0string\0constant"
, qui (si j'ai bien compté correctement) est un tableau 27 dechar
, pas un tableau de 11 dechar
.Instructions de commutation de travail sur
int
valeurs (ouenum
), mais pas surchar
tableaux.Vous pourriez faire
Il ya beaucoup de façons d'aller à ce sujet! Par exemple, l'utilisation d'un...
3-lettre de hachage
Non, vous ne pouvez pas utiliser le
switch
déclaration en C avec la valeur d'une chaîne ou un tableau de caractères. Le plus proche de l'alternative est d'utiliser une sorte de structure de données de la cartographie des chaînes à des pointeurs de fonction. Le pointeur de fonction peut être appelée après qu'une chaîne est utilisée pour le regarder.puisque le nom est déclaré comme un type char ,il serait mieux si vous utilisez
"%c"
au lieu d'utiliser"%s"
à l'intérieur de lascanf()
méthode.Vous pouvez utiliser le "hachage-chaîne.h" de la bibliothèque qui convertit les chaînes de caractères dans le code de hachage entier.
Créer un fichier d'en-tête et de coller ce code:
http://www.opensource.apple.com/source/gcc/gcc-5484/intl/hash-string.h
N'oubliez pas les règles lors de l'utilisation
switch
consolidés.Commutateur contraintes
1. Le contrôle de l'expression d'une instruction switch doit avoir "de type entier".
2. L'expression de chaque cas, l'étiquette doit être une expression constante entière et pas de deux de
le cas des expressions constantes dans la même instruction switch ont la même valeur
après la conversion. Il peut y avoir au plus une seule étiquette par défaut dans une instruction switch.
3. Inclus instruction switch peut avoir une valeur par défaut de l'étiquette ou de l'affaire des expressions constantes dont les valeurs en double cas des expressions constantes dans la enfermant instruction switch.
Si vous êtes après l'exécution d'actions spécifiques en faveur des chaînes de caractères spécifiques, cela implique que vous connaissez les cordes à l'avance. Cela implique à son tour leur nombre est limité, est dénombrable, comme par exemple un ensemble de N commandes:
}
Pour répondre à ces commandes à l'intérieur du tableau ci-dessus à partir de votre code à l'aide d'un swtich vous besoin de connaître leur index, qui est sujette aux erreurs. Si le numéro de leur, de leur donner une ID:
Maintenant mettre les deux ci-dessus à l'aide d'une struct:
Maintenant vous avez les bons cartographie des chaînes et de leurs Identifiants. Pour être en mesure de carte de la chaîne d'ID au cours de l'exécution de la cartographie ci-dessus doit être recherché. Pour ce faire, dans une de manière efficace, vous voulez nous binaire de recherche. La bibliothèque C proveids
bsearch()
pour cela. La seule condition sine qua non est que la matrice cherchée besoin de trier.Pour trier utilisation
qsort()
aussi proveid par la bibliothèque C. Pourqsort()
de travail que nous vous avez besoin d'une comparaison de la fonction:Appel
qsort()
comme ceMaintenant que le tableau est trié, on peut rechercher à l'aide de
bsearch()
. Pour la COMMANDE "-2" ce serait ressembler à ceci:Mettant tout cela ensemble, pourrait entraîner:
L'appeler comme:
donner:
ou:
donner:
ou même
donner: