不知道这是否有帮助,但我编写了一个程序来根据给定文件中找到的字符对字符进行分类。修复它以无条件地遍历 0..255 范围内的字符(字节)并不难。
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
static void classifier(FILE *fp, char *fn)
{
int c;
int map[UCHAR_MAX + 1];
size_t i;
printf("%s:\n", fn);
for (i = 0; i < UCHAR_MAX + 1; i++)
map[i] = 0;
printf("Code Char Space Upper Lower Alpha AlNum Digit XDig Graph Punct Print Cntrl\n");
while ((c = getc(fp)) != EOF)
{
map[c] = 1;
}
for (c = 0; c < UCHAR_MAX + 1; c++)
{
if (map[c] == 1)
{
int sp = isspace(c) ? 'X' : ' ';
int up = isupper(c) ? 'X' : ' ';
int lo = islower(c) ? 'X' : ' ';
int al = isalpha(c) ? 'X' : ' ';
int an = isalnum(c) ? 'X' : ' ';
int dg = isdigit(c) ? 'X' : ' ';
int xd = isxdigit(c) ? 'X' : ' ';
int gr = isgraph(c) ? 'X' : ' ';
int pu = ispunct(c) ? 'X' : ' ';
int pr = isprint(c) ? 'X' : ' ';
int ct = iscntrl(c) ? 'X' : ' ';
int ch = (pr == 'X') ? c : ' ';
printf("0x%02X %-4c %-6c%-6c%-6c%-6c%-6c%-6c%-6c%-6c%-6c%-6c%-6c\n",
c, ch, sp, up, lo, al, an, dg, xd, gr, pu, pr, ct);
}
}
}
我的代码提取的额外技巧是使用setlocale() 在当前语言环境而不是 C 语言环境中工作:
#include <locale.h>
int main(int argc, char **argv)
{
setlocale(LC_ALL, "");
filter(argc, argv, 1, classifier);
return(0);
}
filter()函数处理来自argv[1]的参数(通常是optind而不是1,但是这段代码中没有条件参数处理)到argv[argc-1],读取文件(或读取如果没有命名文件,则为标准输入)。它为打开的每个文件调用classifier()——并处理打开、关闭等操作。