7
votes

Convertir des lettres en chiffres en c

J'essaie d'écrire un code qui convertirait des lettres en chiffres. Par example A ==> 0 B ==> 1 C ==> 2 etc. Je pense à écrire 26 si des déclarations. Je me demande s'il y a une meilleure façon de faire cela ...

Merci!

c

11 commentaires

Juste une note rapide à tous ces "Num = Lettre -" A "Foule. La norme C99 nécessite que les caractères chiffres ('0' - '9') soient consécutifs mais pas les caractères de lettre: "Dans les ensembles de caractères de base de la source et d'exécution, la valeur de chaque caractère après 0 Dans la liste ci-dessus, des chiffres décimaux doivent être supérieurs à la valeur de la précédente. ". EBCDIC (avec son alphabet bizarre disjoint) est parfaitement valide. Cela signifie que @chrislutz a la seule réponse correcte à ce jour, malgré ses inquiétudes à ce sujet :-)


L'ISO devrait avoir mandaté ASCII (ou au moins des lettres séquentielles), mais je soupçonne que IBM avait une grande partie de jouer pour garder leurs compilateurs C mainframe C conformément.


Soulevez votre main si vous avez, faites ou développerez-vous déjà pour une machine EBCDIC.


Élever ma main (timidement) :-) Vous seriez surpris de voir combien de personnages centraux là-bas sont là-bas.


@Pax - Je suis plus que disposé à se tenir debout à mes craintes, même face à tout le monde de l'Ebcdic. Et je conviens que l'ASCII aurait dû être mandatée.


En tout cas, il ne matière Combien de personnes le font. La norme ne nécessite pas de lettres consécutives afin que les impléments soient libres de faire ce qu'ils souhaitent. Les personnes qui codent à la norme ASCII limitent sérieusement leur marché potentiel à environ 99,999% des ordinateurs :-)


ASCII devrait certainement pas a été mandaté, plus qu'un format de point flottant particulier aurait dû être. Si vous souhaitez écrire un montage X86, écrivez X86 Assembly.


Qu'en est-il de àáâãäå si ces personnes doivent-elles être 0 aswell?


S'il s'agit vraiment de devoirs à l'école, vous devriez vous soucier de votre professeur, si votre professeur s'inquiète ou sait même sur les problèmes standard de C99. Sinon, il pourrait vous donner un grade pire juste parce que vous n'utilisez pas l'approche "Nettoyante" (c'est-à-dire lettre - "A") et faire valoir que les normes de C99 ne suffiront pas à le convaincre.


@Greg - Si nous entrons dans ces lettres, nous marchons très rapidement en dehors des limites de la norme C, que nous nous disputez plutôt vivement dans les commentaires pendant un certain temps.


@paxdiablo hey, j'ai posté ce que je pense, c'est la vraie réponse à cette très vieille, mais jamais répondu correctement, question. J'apprécierais un soutien pour déplacer la réponse plus proche du sommet, ou un commentaire expliquant que je suis hors de mon esprit et complètement faux :) Edit: c'est la réponse avec tout le jaune.


10 Réponses :


5
votes

Il y a une bien meilleure façon.

en ASCII ( www.asciditable.com ) Vous pouvez Connaître les valeurs numériques de ces caractères.

'A' est 0x41.

Donc, vous pouvez simplement moins 0x41 d'eux, pour obtenir les chiffres. Je ne sais pas très bien c très bien, mais quelque chose comme: xxx

devrait fonctionner.


12 commentaires

Je ne sais pas si vous avez posté cela avant de voir mon édition; Je me suis corrigé. Je me souviens toujours que c'est comme 41 , je pense que je pense à hex: p


Aussi: int Num = lettre - 'A';


J'étais sur le point de répondre de la même manière mais je pense qu'il n'y a pas besoin de. Je veux juste ajouter que vous pouvez le faire: int ' num = ACHAR -' A '';


Il est plus courant d'utiliser int Num = 'A' - 'A' - (remplaçant le premier avec le caractère ou la variable en question) juste au cas où Nous n'utilisons pas ASCII, bien que je pense que cela pourrait être garanti par la norme. Je sais que la norme garantit que "A" .. 'z' est consécutive dans le jeu de caractères, cependant.


Je préfère utiliser 'A' comme il améliore la lisibilité, sinon quelqu'un doit regarder 0x41 et voir ce que c'est. :)


@Chris: Peu importe que vous sachiez que vous utilisez ASCII ou non. Mettre des nombres magiques (c'est-à-dire des constantes littérales) dans le code est une mauvaise pratique et devrait presque toujours être évitée.


Jeanne: C'est des devoirs, pas une demande réelle. Contexte compte.


Chris: 'A' à 'Z' Être consécutif n'est pas garanti par la norme (seulement '0' à '9').


@CAF: C'est est garanti par la norme ASCII . C'est juste que la norme C ne garantit pas que c Strings sera ASCII!


@silky - non, ça ne le fait pas. Utilisation de 0x41 au lieu de 'A' est stupide. Pourquoi n'écrivons-nous pas tous nos chiffres et nos chaînes directement en binaire? Pourquoi ne pas calculer nos propres sauts et nos arithmétiques du pointeur? @CAF - Cela a été souligné dans divers endroits, mais je passe une journée plutôt difficile mentalement de sorte que cela ne peut pas nuire à me le rappeler. ;) Mais oui, j'étais extrapolé de "0" - "9" étant consécutif à "A" - "Z", et bien que cela ne soit pas vrai, c'est une hypothèse assez sûre que si vous envisagez de rédiger un code pour les ordinateurs centraux. Ne change pas le fait que - 'a' est meilleur que - 0x41 dans presque toutes les situations.


Chris: Je ne suis pas d'accord avec vous et je ne poursuivrai pas une discussion inutile.


Chris: Oui, j'ai vu cela, pensait simplement que cela devrait être enregistré dans ce fil de commentaire pour la postérité;). Daniel: Il est assez clair que "la norme" dans le contexte que je répondais à l'intention de la norme C.



10
votes

Si vous avez besoin de traiter des majuscules et des minuscules, vous voudrez peut-être faire quelque chose comme: xxx

Si vous souhaitez les afficher, vous souhaitez convertir le Numéro dans une valeur ASCII en ajoutant un '0' à celui-ci: xxx


7 commentaires

Alternativement, utilisez num = toupper (lettre) - 'A' pour convertir la lettre en majuscule, évitant ainsi le conditionnel. La fonction TUPPER () est trouvée dans le ctype.h en-tête.


Nous pouvons également noter que les lettres minuscules ne sont qu'à une différence 0x20 en majuscule.


Vrai, mais en ayant un conditionnel, si vous devez différencier d'une manière ou d'une autre, vous pouvez, mais il existe différentes options, je voulais simplement souligner que les majuscules et les minuscules peuvent être un problème et devraient être traités.


En effet. Je mettrais ce code dans une fonction et ajouterais un Num = -1 à la fin uniquement pour la sécurité, mais cela n'a pas d'importance. Vous pouvez vérifier que la valeur de retour de Toupper () - 'A' est dans la plage souhaitée (0 à 25) aussi facilement.


Un meilleur moyen d'afficher le numéro est juste d'utiliser printf () (ou sprintf () si vous devez travailler avec elle comme une chaîne).


Notez que "l'asciinumber = num + '0"; " Le bit ne fonctionne que pour les chiffres simples.


Vous êtes correct, je n'ai pas tenu compte que AscIinumber est imparfait.



5
votes

Un autre, bien pire (mais toujours meilleur que 26 si instructions) est d'utiliser commutateur / case : xxx < / Pré>

considère que ceci uniquement s'il n'y a absolument aucune relation entre la lettre et son code. Comme il existe une relation séquentielle claire entre la lettre et le code dans votre cas, l'utilisation de cela est plutôt idiote et d'être affreux de maintenir, mais si vous deviez encoder des caractères aléatoires à des valeurs aléatoires, ce serait le moyen d'éviter d'écrire Zillion si () / else si () / el () / ele


4 commentaires

C'est pas si stupide. Malgré votre commentaire ailleurs, @chris, C99 n'impose que si les caractères numériques sont en ordre. Alphas peut être partout (tel que EBCDIC avec ses deux zones différentes). C'est en fait la seule réponse correcte à ce jour. + 1.


Ah. Je suis surtout sur la route aujourd'hui. Je savais que les chiffres étaient en ordre, je viens de faire un saut sur les personnages. J'ai vraiment besoin de lire la norme C. Je dois dire, si c'est le prix de l'exactitude, je suis prêt à dire "en enfer!" avec EBCDIC.


Il est bon que tout le monde sache que la commande n'est pas garantie, mais sérieusement, vous devez prendre en compte votre public. Si ce programme va être utilisé par des personnes exécutées sur tout ordinateur "standard", il est sûr d'utiliser "lettre -" A ""


@Ed: mon auditoire (visuance?) Est composé de personnes qui connaissent et suivent la norme (et c'est standard sans citations). Votre programme ne serait pas conforme à la norme. C'est bon - je comprends que la grande majorité des environnements C utilisent ASCII ou ISO646, mais je le considère légèrement arrogant pour indiquer que c'est tout ce qui compte. ISO GAUCHE Ouvrez la possibilité de lettres non contiguës pour une bonne raison - pensez-vous vraiment que vous savez mieux que celles-ci? Je ne veux pas entrer dans un match de P * Ssing, en mettant juste mon point de vue en avant - nous devons simplement accepter de ne pas être en désaccord.



0
votes

Dans la plupart des langues de programmation et de script, il existe un moyen d'obtenir la valeur "ordinale" de tout personnage. (Pensez-y comme un décalage depuis le début du jeu de caractères).

Ainsi, vous pouvez généralement faire quelque chose comme: xxx

Bien sûr que cela ne fonctionnerait pas pour Un système basé sur l'EBCDIC (et pourrait ne pas fonctionner pour d'autres ensembles de caractères exotiques). Je suppose qu'un chèque de santé mentale raisonnable serait de tester cette fonction renvoyée des valeurs croissantes monotone dans la plage 0..26 pour les chaînes "ABC ... XZY" et "ABC ... XYZ").

Une approche complète serait de créer un tableau associatif (dictionnaire, table, hachage) de vos lettres et leurs valeurs (une ou deux boucles simples). Ensuite, utilisez cela. (La plupart des langages de programmation modernes incluent la prise en charge des tableaux associatifs.

Naturellement, je ne "faites pas tes devoirs". Vous devrez le faire pour vous-même. J'explique simplement que ce sont les approches évidentes Cela serait utilisé par tout programmeur professionnel. (D'accord, un hack de la langue de montage pourrait également simplement masquer un bit pour chaque octet, aussi).


2 commentaires

La plupart de ces informations ne s'appliquent pas aux questions C. ont des balises de langue pour une raison.


@Chris: Je suppose que nous devons simplement accepter de ne pas être d'accord. Je trouve l'approche de pseudo-code très bien. Si rien d'autre, il obligera les étudiants à rechercher la syntaxe dont ils ont déjà été informés - et devaient regarder quelque chose que vous devriez déjà savoir est un bon bon moyen de l'apprendre. En outre, pour de nombreux élèves non familiarisés avec la syntaxe C-Style Syntaxe, C pour Les boucles sont plutôt confus: un seul mot-clé, mais beaucoup d'opérateurs et de séparateurs, et lesquels des expressions entre celles qui vous font viennent de devez savoir.



-1
votes

Étant donné que le type de données de caractère est traité similaire à celui d'un type de données INT en C et C ++, vous pouvez aller avec quelque chose comme suit:

#include <ctype.h> // if using C++ #include <cctype>
int urValue = toupper(c) - 65;


0 commentaires

11
votes

C'est une façon que je ressens mieux que la méthode code> Switch code>, et pourtant est conforme aux normes (n'assume pas ASCII):

#include <string.h>
#include <ctype.h>

/* returns -1 if c is not an alphabetic character */
int c_to_n(char c)
{
    int n = -1;
    static const char * const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char *p = strchr(alphabet, toupper((unsigned char)c));

    if (p)
    {
        n = p - alphabet;
    }

    return n;
}


3 commentaires

Pour la conformité des normes complètes, vous voudrez peut-être lancer p - alphabet avant de l'attribuer. Vous pouvez utiliser un ptrdiff_t ou un autre type techniquement correct, mais compte tenu des limitations de la plage, je ne pense pas que ce soit vraiment nécessaire. Tout type intégré est garanti de pouvoir contenir l'une des valeurs que nous utilisons ici.


Oui, dans ce cas, nous pouvons garantir que p - alphabet est compris dans la plage 0 ... 25, il va donc définir définitivement dans un int . Je ne crois pas qu'un casting est nécessaire - la sémantique de l'attribution d'un type intégral à un autre est assez bien définie.


Je vous donnerai un vote pour celui-ci @Caf, car il gère tous les jeux de caractères dans la norme. C'est aussi l'un des rares moments où j'ai vu quelqu'un utilise le const Const correctement pour le pointeur et le pointe :-) Bien sûr, être un vieux temps, j'aurais juste fait: 'Retour P? (int) (p - alphabet): -1; ' au lieu de tout ce qui vous brouille avec N et si des déclarations.



-1
votes

aww si vous aviez C ++

pour Unicode Définition de la mapper des caractères à des valeurs xxx

utilisation xxx


0 commentaires

-1
votes

J'ai écrit ce bit de code pour un projet et je me demandais à quel point cette approche était naïve.

L'avantage est que cela semble être adhérent à la norme et que je suppose que le temps d'exécution est d'env. O (k) où k est la taille de l'alphabet. xxx


1 commentaires

Ou vous pouvez réduire ce code à deux lignes, en utilisant strchr () :-)



8
votes

La norme C ne garantit pas que les caractères de l'alphabet seront numérotés de manière séquentielle. Par conséquent, le code portable ne peut pas supposer, par exemple, que 'B' - 'A' - code> est égal à 1.

La section correspondante de la spécification C est la section 5.2.1 décrivant les ensembles de caractères : P>

3 à la fois des ensembles de base de la source et d'exécution de base doivent avoir Les membres suivants: les 26 lettres majuscules em> du latin Alphabet P>

char letter = 'E';                  // could be any upper or lower case letter
char str[2] = { letter };           // make a string out of the letter
int num = strtol( str, NULL, 36 ) - 10;  // convert the letter to a number


0 commentaires

-1
votes
#include<stdio.h>
#include<ctype.h>
int val(char a);
int main()
{
    char r;
    scanf("%c",&r);
    printf("\n%d\n",val(r));
}
int val(char a)
{
    int i=0;
    char k;
    for(k='A';k<=toupper(a);k++)
    i++;
    return i;
}//enter code here

1 commentaires

Bienvenue dans le débordement de la pile! Bien que ce code puisse aider à résoudre le problème, il n'explique pas pourquoi et / ou comment répond à la question. Fournir ce contexte supplémentaire améliorerait de manière significative sa valeur éducative à long terme. S'il vous plaît Modifier Votre réponse à ajouter une explication, y compris quelles limitations et hypothèses s'appliquent.