J'ai joué avec un code ancien et je suis tombé sur une fonction que j'ai passé il y a quelque temps qui calcule le nombre de fois que chaque lettre alphabétique apparaît dans une chaîne donnée. Dans ma fonction initiale, je voudrais parcourir la chaîne 26 fois en comptant le nombre de fois que chaque lettre apparaît à mesure qu'elle bouge. Cependant, je savais que c'était vraiment inefficace, alors j'ai essayé de le faire: Le code ci-dessus boucle via une chaîne et vérifie chaque caractère. Si le caractère est une lettre alphabétique (AZ ou AZ), je incrémente le nombre de fréquences à un indice spécifique dans le tableau code> FreqCount code> (où index 0 = A \ A, 1 = b \ b ,. .., 25 = z \ z). P> Le code semble compter bien, mais lorsque j'imprime la matrice, je reçois la sortie suivante: P> chaîne: "ABCDEFGHIJKLMNOPQRSTUVWXYZIII" P>
blockQquote> Pour référence, j'imprime le tableau de la manière suivante: p>
for (i = 0; i < 26; i++) {
printf("%c/%c %d\n", i + 97, i + 65, freqCount[i]);
}
3 Réponses :
essai principal: p>
En ce qui concerne: printf ("% d \ n", n [4]); code> Qu'attendez-vous que cette déclaration fasse-elle? Il n'imprimera que le compte dans l'élément 5 de la matrice de fréquence.
Il imprime 3, puisque la 5ème lettre est E, si vous vérifiez la fin de la chaîne, j'ai écrit "Troisième E", avec les minuscules et majuscules de T "Bonjour"
Le code posté des OPS imprime tous les 26 chefs qui font partie de la question, alors il suffit d'imprimer un décompte n'est pas suffisant.
Des tours laids tels que freqcount [(C & ~ 32) - 65] ++; code> apportez un code illisible et immobile. Au moins écrire
'a' code> au lieu de
65 code>.
Je ne pense pas que ce soit un moche mais assez efficace et élégant pour quiconque comprend la table ASCII.
Le code proposé suivant:
malloc () code>, calloc () code>, etc li>
- conserve la définition des données, etc. à l'intérieur de la fonction
principale () code> li>
- effectue la fonctionnalité souhaitée li>
- compile parfaitement li>
- utilise des littéraux de caractères simples plutôt que des chiffres de «magie» li>
- attend le jeu de caractères ASCII LI>
ol>
et maintenant, le code proposé: p> xxx pré> une exécution du code donne: p> xxx pré> < / p>
Sur les systèmes avec signature char code>, vous devez lancer l'argument
char code> sur
isalpha () code> comme
isalpha ((non signé) chaîne [i ]) code> parce que
isalpha () code> a un comportement non défini pour les valeurs négatives, sauf
eof code>.
@chqrlieforyLockLockQuotes, la séquence alpha code> est toutes dans les 127 premiers caractères ASCII, de sorte que le signe d'un caractère n'a aucun effet
Vous passez tous les caractères de la chaîne à isalpha () code>, comment savez-vous s'ils sont tous positifs? Par exemple, si la chaîne contient des points de code non ascii codés UTF-8, ces octets seraient considérés comme négatifs. Techniquement, la distribution n'est pas requise pour l'appel code> code> car tous les caractères alpha sont effectivement positifs, mais il est nécessaire pour le
isalpha () code> appelé comme vous ne pouvez pas faire de hypothèse sur le contenu de la chaîne.
La fonction: isalpha () code> renvoie false si la lettre est en dehors de la plage 0x00 ... 0x7f et retourne false pour de nombreux personnages à l'intérieur de cette plage
C17 7.4 Manutention de caractères
int code>, la valeur qui doit être représentable sous forme de char code> non signé ou doit être égal à la valeur de la macro
EOF code> . Si l'argument a une autre valeur, le comportement est indéfini. Les tests code> isalpha code> pour n'importe quel caractère pour lequel
isupper code> ou
isslower code> est vrai, ou n'importe quel caractère qui est l'un des paramètres alphabétiques spécifiques à la localisation. Caractères pour lesquels aucun de
iscntrl code>,
isdigit code>,
ispunct code> ou
Isspace code> est vrai.
Le problème est celui-ci sur les plates-formes où char code> est signé par défaut: si l'argument de chaîne contient des octets extérieurs
0x00-0x7f code>, ces octets sont lus comme
char code> Les valeurs ont une valeur négative, pour laquelle le comportement de
isalpha () code> est indéfini. Pour éviter ce comportement potentiel non défini,
Char CODE> Les valeurs qui ne sont pas connues pour être positives doivent être modifiées comme
(non signé) code>. Par conséquent, vous devriez écrire
isalpha ((sans signé Char) chaîne [i]) code>.
Il y a 2 problèmes dans votre code:
freqcount code> est ininitialisé. LI>
- Vous devez éviter de passer
Char code> Valeurs sur ISALPHA CODE> car il provoquerait un comportement non défini si chaîne code> contient négatif char code> Valeurs sur les systèmes où Char code> est signé par défaut. LI>
ul> au lieu d'un opérateur ternaire ou d'une instruction si code>, vous pouvez utiliser toupper () code> pour convertir des caractères minuscules en majuscule et il est plus lisible à Écrivez 'A' code> ou 'A' code> au lieu de leurs valeurs ASCII codées durement 65 code> et 97 code>. P > Voici une version corrigée: p> xxx pré> p>
Vous ne définissez jamais les valeurs du tableau à 0, vous êtes donc
++ code> des ordures laissées dans la mémoire.
malloc code> n'initialise pas le tableau, le code doit donc l'initialiser, soit avec
MEMSET code> ou une boucle, ou à l'aide de
calloc code> au lieu de
malloc code>
BTW, 65 et 97 doivent être écrits comme
'A' code> et
'a' code> respectivement. Cela rend le code plus facile à lire et vous n'avez pas à vous souvenir de ce que sont ces chiffres.
@Timothy Cattana par la manière dont toutes les lettres ne se succèdent pas sans des lacunes. Par exemple, pour le codage EBCDIC, le programme ne fonctionnera pas.
D'accord, donc i
memset (freqcount, 0, 26) code> et corrige la sortie d'un \ a-f \ f. Mais je reçois toujours une sortie des ordures pour g \ g et h \ h.
MEMSET (FREQCOUTE, 0, 26 * TAILLEOF (INT)) CODE> ... ou JUST
CALOCOC () CODE> Au lieu de
MALLOC () CODE> ... Ou tout n'utilisez pas d'allocation dynamique du tout puisqu'il s'agit juste d'un ensemble de 26
int code> array:
int freqcount [26] = {0}; code>.
@Marcobonelli Yea, j'ai oublié que j'utilisais un pointeur, mon mal. Je n'ai jamais utilisé CalloC avant, je vais regarder. De plus, quand j'ai écrit ce code, j'apprendais toujours une allocation dynamique, c'est pourquoi j'utilise un pointeur.
J'ai compris.
calloc () code> est probablement le moyen le plus simple de résoudre ce problème, c'est la même chose que
masloc () code> mais initialise tous les éléments à
0 code>.
(Techniquement, il initialise tous les bytes i> zéro, mais ... c'est rarement un problème autre que les personnes qui l'indiquent dans des commentaires et que la norme ne garantit pas que l'allocation de CalloC entraînera des pointeurs
Null code> ...)