2009-11-17 15 views
-1

Vous avez donc la table de correspondance des 26 caractères ascii de l'alphabet anglais à leurs chaînes de code morse correspondantComment retourner l'indice de ascii omble chevalier en C

typedef struct a_look_tab { 
    char table[asciiNum][MORSE_MAX+1]; 

} ALookTab; 

et asciiNum est le 0 pour, 1 pour b , etc. comment retourner un index (int) qui est l'indice du morse morse.

Donc, ce que nous faisons après la conversion d'un caractère en nombre est param ascii Le caractère ASCII à convertir et retourner L'index pour le caractère ascii donné, comment faisons-nous cela?

+1

Cette question est à peine compréhensible, vous devez éditer et reformulez –

+0

est-ce mieux? – c2009l123

+0

Vous voulez convertir un caractère ASCII en un nombre. Par exemple, a-> 0 b-> 1 etc. Comment le faire? est-ce la question? – Naveen

Répondre

2

Vous devez convertir un caractère, tel que 'a', en index dans la table. Selon votre spécification, la table commence par le code Morse pour 'a', donc 'a' doit correspondre à l'index 0, 'b' doit correspondre à 1, et ainsi de suite.

La cartographie comme la plus simple pourrait être mis en œuvre comme ceci:

int char_to_index(char c) 
{ 
    return tolower(c) - 'a'; 
} 

Ce soustraient le code ASCII pour « une » de la lettre donnée, qui tournera « a » dans 0, et ainsi de suite. Malheureusement, cela ne fonctionne que si l'ordinateur exécutant le programme code les lettres de l'alphabet en utilisant un système qui attribue des codes contigus aux lettres. Tous les ordinateurs ne sont pas comme ça. Une fonction plus portable pourrait faire le mappage explicitement, comme ceci:

int char_to_index2(char c) 
{ 
    switch(tolower(c)) 
    { 
    case 'a': return 0; 
    case 'b': return 1; 
    case 'c': return 2; 
    /* and so on */ 
    } 
} 

Ce code est sage plus bavard, mais plus portable.

MISE À JOUR: J'ai ajouté des appels à tolower() aux deux fonctions pour les rendre un peu plus robustes.

+0

Pour l'anecdote, je passerais (tolower (c)) 'mais c'est juste parce que j'aime l'insensibilité à la casse (le capital K est plutôt sensible à son cas). –

+0

@Chris: D'accord. Je visais un maximum de transparence/simplicité, mais un appel à tolower() n'est pas trop demander. :) Merci! – unwind

2

Notez que la norme C ne nécessite pas ASCII, et ce code ne fonctionnera pas sous EBCDIC, mais 99% du temps cela n'aura aucune importance.

Je crois que ce que vous cherchez est beaucoup plus simple que vous ne le pensez. Les littéraux de caractère comme 'c' et '0' sont actuellement int s, et non char s - ils sont réduits à char lors de l'affectation, et peuvent être tout aussi facilement renvoyés. Voilà donc ce que (je pense) que vous voulez:

#include <ctype.h> // for tolower() 

char *func(ALookTab *a, char c) 
{ 
    if(isalpha(c)) 
     return a->table[tolower(c) - 'a']; 
    if(isdigit(c)) 
     return a->table[c - '0' + 26]; 
    // handle special characters 
} 

Notez que ce code suppose que votre code morse est stocké sous forme de 26 caractères de l'alphabet, les 10 chiffres, puis d'autres caractères spéciaux dans l'ordre que vous choisissez.

3

Le plus simple portable façon de convertir le char est un indice de ce type de construction:

/* Returns -1 if c is not an upper- or lower-case alphabetical character */ 
int char_to_index(char c) 
{ 
    static const char * const alphabet = "abcdefghijklmnopqrstuvwxyz"; 
    char *p = strchr(alphabet, tolower((unsigned char)c)); 

    return p ? p - alphabet : -1; 
}