Comment puis-je écrire une seule boucle de course de a à z et de A à Z dans C?
Je veux combiner les deux pour des boucles en une seule boucle. Comment puis-je le faire?
Je veux faire une boucle par de a à z et A à Z, comme suit:
char ch;
for (ch = 'A' ; ch <= 'Z' ; ch++ )
{
}
for (ch = 'a' ; ch <= 'z' ; ch++ )
{
}
mais à l'aide d'une seule boucle.
Si vous voulez en C, pourquoi cette question est également étiqueté C++?
... et le point de ce qui est?
hopp , désolé, j'ai supprimé le c++ , qui a été par erreur.
Est-ce devoirs?
Ensuite, vous devez utiliser
... et le point de ce qui est?
hopp , désolé, j'ai supprimé le c++ , qui a été par erreur.
Est-ce devoirs?
Ensuite, vous devez utiliser
isalpha
au lieu de le faire vous-même.OriginalL'auteur kobe | 2011-06-15
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas personnellement comme cette solution, mais:
ne sera pas, mais
*ptr
volonté. Sinonstrlen(letters)
ne fonctionnerait pas.1. +1. 2. Fixe que l'OP code ne lettres majuscules en premier. 3. Élargi à l'ensemble de l'alphabet de la chaîne.
Hmm, je n'ai pas fait préférer cette approche Billys. C'est moins lisible (on constate un manque de caractère dans une magie de la chaîne comme ça, ou de l'avis, si l'ordre où inhabituel?), il est probablement plus lent, et il n'est même pas tout court. Non pas que cela importe vraiment dans un cas simple...
Moi aussi, je n'aime pas cette solution (principalement pour les raisons Eamon souligné), mais si vous vous souciez qu'il soit complètement portable et agnostique à codage de caractères, je pense que c'est à peu près la seule solution correcte. Si vous êtes heureux d'assumer en ASCII codage, utilisez l'une des autres réponses.
OriginalL'auteur Ernest Friedman-Hill
Devrait fonctionner -- mais s'il vous plaît, s'il vous plaît, ne pas infliger ça à vos collègues développeurs.
Lol-Merci!
+1: simple, fonctionne.
Non, bien sûr, je suis sur un mainframe IBM. Mon commentaire s'adressait à @Eamon "simple, les œuvres". Ernest la solution de ne travail, et je peux même ajouter le åäö j'ai besoin de ma langue maternelle. 🙂
Ou pour le dire d'une autre manière - l'OP dit que la boucle s'exécute de
A
àZ
, non pas que les valeurs entreA
etZ
sont tous les Roman lettres majuscules 🙂 Donc, il ne le "travail" sur EBCDIC trop, c'est juste énumère un ensemble différent dechar
des valeurs, qui ne sont pas des points du code de caractère à tous. Insuffisance spécifications pouvez toujours être weaseled-à-dire ce que le code fait réellement. Va mal si'z' < 'A'
, de l'esprit, mais à moins que la Bo de fouets rapide C mise en œuvre à l'aide d'un jeu de caractères qu'il invente aujourd'hui, ce n'est pas le cas sur la machine, il est.OriginalL'auteur Billy ONeal
Vous pouvez le faire dans une boucle imbriquée (deux boucles, mais seulement une partie du corps):
Mua-ha-ha! (et merci!) La maintenance du Code folk besoin d'un défi maintenant et puis. 🙂
Je suggère plutôt
char start = 'A'; do{ char end = start + 'Z' - 'A'; char ch; for (ch = start; ch <= end; ++ch) { /* body */ } }while((start = 'A' + 'a' - start) == 'a');
qui n'a pas d'ASCII de la dépendance.qui a encore la dépendance qui a..z sont consécutifs; et ce n'est pas comme ASCII/unicode est d'aller n'importe où...
Mais le but est de reproduire des OP d'origine comportement en boucle, ne pas frapper chaque lettre et ne lettres. 🙂
OriginalL'auteur Ted Hopp
Bien, la première question est pourquoi? ...et la deuxième question est de faire vous vous souciez de la non-jeux de caractères ASCII (comme vos deux boucles échoue pour EBCDIC), mais la façon rapide et sale de raccordement de l'est
OriginalL'auteur Chris Dodd
l'idée est de combiner le contenu des deux boucles, pour les caps utilisation
ch
et pour les petits, l'utilisationsmall_ch
.Oui, c'est vrai. Cependant, à proprement parler, l'OP du code effectue une itération comme "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", bien que cet exemple va se répéter que "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpqqrrssttuuvvwwxxyyzz". Si l'ordre importe le résultat serait différent.
merci pour tous les commentaires et de votre temps
Je pense que ce n'est pas la question. Si vous allez répéter la logique, à la fois pour le ch et une fois pour small_ch, vous pourriez aussi bien avoir de boucles. Ce qui est voulu est la seule variable ch pour itérer sur A .. Z, a .. z, et d'appliquer une certaine logique à chaque fois.
OriginalL'auteur iammilind
Essayez ceci:
6
avec('a' - 'Z')
de supprimer l'ASCII dépendance.Eamon Nerbonne souligne que le simple fait que 'a' .. 'z' sont contigus est un ASCII dépendance ... seulement Ernest Friedman-Hill réponse évite que. (Encore,
('a' - 'Z')
est moins obscur que6
.)OriginalL'auteur Scott Urban
ONeal Ya, mais pour imprimer le nombre de caractères, cela devrait suffire je pense.
Euh, je crois que le but est d'éviter la duplication de la logique, qui est sans doute le même pour tous les personnages.
OriginalL'auteur N.R.S.Sowrabh
OriginalL'auteur g123
Une solution simple et efficace est
bien que je préfère, surtout sensible dans les langues qui permettent des fonctions imbriquées,
P. S. Kobe, je vois dans l'un de vos commentaires que votre raison pour les boucles est de vérifier si un caractère est une lettre ... mais la boucle est une horrible façon de le faire. Vous pouvez simplement faire
ou, beaucoup mieux,
(Pour comprendre pourquoi que le cast est nécessaire, lire la isalpha page de man et le langage C standard. C'est l'un de plusieurs abominable aspects de C.)
OriginalL'auteur Jim Balter
Cette approche est similaire à Billy, mais avec un peu moins méchant boucle-incrément de déclaration. Je ne me dérangerait pas infliger cela sur un autre dev, bien que je pourrais écrire l'incrément de déclaration d'une fonction à préciser si la valeur de l'échelon déclaration a plus complexe:
ch++
de Billy code et vous obtenezch == 'Z'?ch='a':ch=ch+1
; vous avez simplement pris en compte lach=
et déplacé plus de chemin depuis ses rhs, ce qui pourrait être considéré comme plus méchant. Comme pour le fait d'infliger, ni l'un ni (ni tout à fait un peu d'autres réponses ici) serait de passer mon examen de code.Eh bien, j'aime mes expressions sans effets secondaires; donc, je préfère de beaucoup
x = some-side-effect-free-expression
à un si déguisé en ternaire. Une telle formulation se prête mieux à la fonction d'extraction (sans se soucier de l'aliasing et autres joyeusetés). En outre, la quintessence de la boucle est une phase d'initialisation, un test, et un incrément, donc plus proche de ce modèle, je peux rester, plus je suis content -- bien sûr, tout est donc trivialement bref rien de tout cela ne me dérange pas, mais à chacun son propre. La mauvaise qualité dépend vraiment du contexte.OriginalL'auteur Eamon Nerbonne
C'est inutile, il suffit d'utiliser une boucle for. Les variables sont principalement utilisés comme compteurs, ou les limites de la boucle de sorte qu'il sait quand il faut mettre fin. Faire une boucle. Deux boucles sont totalement inutiles.
OriginalL'auteur Jason
OriginalL'auteur Abhishek Nag
Cela comprendra également quelques caractères comme '[' et ']'...
OriginalL'auteur slartibartfast