2010-08-25 13 views
2

Vous avez une question concernant l'impression des 128 premiers caractères de la table ascii. Je ne suis pas encore arrivé si loin, parce que je suis déjà tombé sur un problème. Le code suivant imprime la valeur correcte à partir de 32-127. De 0 à 31 cependant, il imprime des valeurs de rebut. Je suppose qu'il est correct aussi bien que je vérifie rapidement sur le asciitable.com ces valeurs représente quelque chose d'autre à côté de l'ABC ... Z. Donc, ma question est comment je peux imprimer ces valeurs comme dans l'exemple de sortie? Et aussi je veux savoir comment on devrait écrire un programme qui s'imprime comme l'exemple de sortie. Puisque les solutions que je peux penser me donneraient la sortie par exemple. 1 à 10 caractères dans les lignes plutôt que dans les colonnes.Imprimer ascii table 0-127

int main() 
{ 
    int i =0; 
    for(int rows = 0; rows < 16; rows++) 
    { 
     i = rows; 
     while(i <= 127) 
     { 
      if(i <= 15) 
       cout << hex << setw(2) << setfill('0') << i << "= " << setw(2) << setfill(' ') << toStr(i) << " | "; 
      else 
       cout << hex << setw(2) << setfill('0') << i << "= " << setw(2) << setfill(' ') << char(i) << " | "; 
      i+=16; 
     } 

     cout << "\n"; 
    } 

    return 0; 
} 

Exemple sortie

+--------+--------+--------+--------+--------+--------+--------+--------+ 
| 00  | 10  | 20 ' ' | 30 '0' | 40 '@' | 50 'P' | 60 '`' | 70 'p' | 
| 01  | 11  | 21 '!' | 31 '1' | 41 'A' | 51 'Q' | 61 'a' | 71 'q' | 
| 02  | 12  | 22 '"' | 32 '2' | 42 'B' | 52 'R' | 62 'b' | 72 'r' | 
| 03  | 13  | 23 '#' | 33 '3' | 43 'C' | 53 'S' | 63 'c' | 73 's' | 
| 04  | 14  | 24 '$' | 34 '4' | 44 'D' | 54 'T' | 64 'd' | 74 't' | 
| 05  | 15  | 25 '%' | 35 '5' | 45 'E' | 55 'U' | 65 'e' | 75 'u' | 
| 06  | 16  | 26 '&' | 36 '6' | 46 'F' | 56 'V' | 66 'f' | 76 'v' | 
| 07'\a' | 17  | 27 ''' | 37 '7' | 47 'G' | 57 'W' | 67 'g' | 77 'w' | 
| 08'\b' | 18  | 28 '(' | 38 '8' | 48 'H' | 58 'X' | 68 'h' | 78 'x' | 
| 09'\t' | 19  | 29 ')' | 39 '9' | 49 'I' | 59 'Y' | 69 'i' | 79 'y' | 
| 0a'\n' | 1a  | 2a '*' | 3a ':' | 4a 'J' | 5a 'Z' | 6a 'j' | 7a 'z' | 
| 0b'\v' | 1b  | 2b '+' | 3b ';' | 4b 'K' | 5b '[' | 6b 'k' | 7b '{' | 
| 0c'\f' | 1c  | 2c ',' | 3c '<' | 4c 'L' | 5c'\\' | 6c 'l' | 7c '|' | 
| 0d'\r' | 1d  | 2d '-' | 3d '=' | 4d 'M' | 5d ']' | 6d 'm' | 7d '}' | 
| 0e  | 1e  | 2e '.' | 3e '>' | 4e 'N' | 5e '^' | 6e 'n' | 7e '~' | 
| 0f  | 1f  | 2f '/' | 3f '?' | 4f 'O' | 5f '_' | 6f 'o' | 7f  | 
+--------+--------+--------+--------+--------+--------+--------+--------+ 

EDIT Je suis une solution tout à fait ok maintenant je pense que, sous la direction du code. En plus de comprendre comment imprimer en colonnes, j'ai aussi utilisé la fonction que Martin a bien fournie.

Répondre

3

Si le caractère est inférieur à 32, il s'agit d'un caractère spécial qui peut ne pas avoir de glyphe visible. Donc, si le personnage est en dessous de 32, vous devriez en tenir compte et mettre une chaîne de caractères appropriée à sa place.

#include <iostream> 

// An array of strings for all the special characters. 
char const* data[] = {"", "", "", "", "", "", "", "" 
         "\\a","\\b","\\t","\\n","\\v","\\f","\\r" 
         // etc 
        }; 

char const* toStr(int loop) 
{ 
    // Used by normal character. 
    // Note buffer[0] is where we put the char. buffer[1] is always '\0' 
    static char buffer[] = " "; 

    if (loop < 32) 
    { 
     return data[loop]; 
    } 
    else 
    { 
     buffer[0] = loop; 
     return buffer; 
    } 
} 

int main() 
{ 
    for(int loop =0;loop < 128;++loop) 
    { 
     std::cout << loop << "=" << toStr(loop) << "\n"; 
    } 
} 
+2

Je pense que vous voulez dire des caractères «non imprimables». – Chubsdad

0

Vérifiez le programme gnu ascii. Il fait quelque chose de similaire.

+0

souhaitez-vous partager ce lien? ou est-ce celui-ci? http://www.gnu.org/graphics/gnu-ascii.html – starcorn

+0

Je crains de ne pas pouvoir le trouver non plus ... doit être caché quelque part. –

1

Ces caractères n'ont pas de représentation graphique normalisée ASCII, bien que certaines polices/jeux de caractères en fournissent une. Sur les anciens systèmes DOS (et mon ancien Zilog Z-80), par exemple, vous pouvez "piquer" les valeurs dans la mémoire vidéo pour voir les caractères associés. De même, 128-256 avait des graphiques supplémentaires utilisés pour dessiner des lignes, des boîtes, faire des ombrages, etc. Mais, seulement ceux que vous avez pu imprimer sont vraiment significatifs en tant que caractères ASCII. Si vous voulez vraiment en afficher plus, vous devez rendre votre programme très couplé au système d'affichage avec lequel il interagit - trouver des séquences d'échappement spéciales qu'il supporte pour afficher des caractères non standard, écrire via une API graphique ou revenir en arrière à l'approche "pousser dans la mémoire" de l'année-année ....

Pour briser la sortie dans les colonnes, vous pouvez ajouter une déclaration supplémentaire dans votre boucle pour voir si (i% num_columns == 0), puis écrire un caractère de nouvelle ligne '\ 0'. Si vous voulez que les colonnes sautent en valeur, utilisez i + = 16 au lieu de i ++, puis placez "if (i> 0x70) {i - = 0x6F; std :: cout < < '\ n'; début de la nouvelle rangée.

0

Certains caractères ne sont pas destinés à être affichés; par exemple, le 7e, si je me souviens bien, c'est la «cloche», qui émet un bip sonore (à cause des machines à écrire, vous savez, quand vous avez fini votre ligne, ça sonne).

Le meilleur moyen portable que je sais est de mettre une condition et ne pas imprimer entre 0 et 31, ou de stocker dans un tableau les noms classiques de ces caractères (BR, LF, etc., vous pouvez les trouver facilement sur le web) et affichez-les au lieu d'essayer d'afficher le caractère lui-même, puisque ceux-ci sont par définition non affichables.

1

Les caractères avant 32 sont des caractères de contrôle. Par exemple, ascii 7 est le caractère "bell", 13 est linefeed et ainsi de suite. Vous devez donc savoir comment les imprimer. En ce qui concerne l'impression par colonne au lieu de lignes, voici un indice: notez que la première ligne contient des caractères ASCII 0, 10, 20, ..., 70; la seconde a 1, 11, ... 71. Vous devriez être capable de comprendre le motif et notez que vous avez besoin de deux boucles (une extérieure et une intérieure) où la boucle intérieure imprime les caractères qui appartiennent à la rangée donnée par la boucle externe.

+0

Je ne comprends pas comment on peut revenir au début après avoir imprimé la première colonne. Ou suis-je censé imprimer tout en lignes, par ex. sur la première série, j'imprime 00,10,20 ... 70? J'ai mis à jour mon code. – starcorn

+0

nvm J'ai eu l'idée maintenant – starcorn

+0

Il ya une raison pour laquelle je n'ai pas élaboré, je suppose que vous avez pensé que :) –